From 7451954867500a76f2540024ee3532be47577a42 Mon Sep 17 00:00:00 2001 From: mwinter80 Date: Fri, 27 Jan 2017 17:58:19 -0500 Subject: [PATCH] Add files via upload --- 4_computer_music_studies.pdf | Bin 0 -> 43507 bytes .../computer_music_study_1_generator.ipynb | 135 +++++ .../computer_music_study_1_music21_Link.scd | 52 ++ .../computer_music_study_2.scd | 10 + .../computer_music_study_3.scd | 132 +++++ .../allocator.pde | 34 ++ .../delayGraphGui.pde | 472 ++++++++++++++++++ .../edge.pde | 253 ++++++++++ .../vertex.pde | 238 +++++++++ .../computer_music_study_4_synthDefs.scd | 89 ++++ 10 files changed, 1415 insertions(+) create mode 100644 4_computer_music_studies.pdf create mode 100644 computer_music_study_1/computer_music_study_1_generator.ipynb create mode 100644 computer_music_study_1/computer_music_study_1_music21_Link.scd create mode 100644 computer_music_study_2/computer_music_study_2.scd create mode 100644 computer_music_study_3/computer_music_study_3.scd create mode 100644 computer_music_study_4/computer_music_study_4_processingGUI/allocator.pde create mode 100644 computer_music_study_4/computer_music_study_4_processingGUI/delayGraphGui.pde create mode 100644 computer_music_study_4/computer_music_study_4_processingGUI/edge.pde create mode 100644 computer_music_study_4/computer_music_study_4_processingGUI/vertex.pde create mode 100644 computer_music_study_4/computer_music_study_4_synthDefs.scd diff --git a/4_computer_music_studies.pdf b/4_computer_music_studies.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4177bbffe3055726232a6ae03ee3de12b2bb72c6 GIT binary patch literal 43507 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 literal 0 HcmV?d00001 diff --git a/computer_music_study_1/computer_music_study_1_generator.ipynb b/computer_music_study_1/computer_music_study_1_generator.ipynb new file mode 100644 index 0000000..c225a29 --- /dev/null +++ b/computer_music_study_1/computer_music_study_1_generator.ipynb @@ -0,0 +1,135 @@ +{ + "metadata": { + "name": "", + "signature": "sha256:bfe399c4bdb7ac4ba9372d224adaf9ea707649999c1740acf1e4006f2c9b7207" + }, + "nbformat": 3, + "nbformat_minor": 0, + "worksheets": [ + { + "cells": [ + { + "cell_type": "code", + "collapsed": false, + "input": [ + "from music21 import *\n", + "import random\n", + "from scipy.stats import rv_discrete\n", + "from OSC import OSCClient, OSCMessage" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 2 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "# set up OSC client\n", + "client = OSCClient()\n", + "client.connect(('127.0.0.1', 57120))\n", + "\n", + "def play_sc(stream, streamName, durScale):\n", + " pBinds = []\n", + " for p in range(len(stream)):\n", + " part = stream[p].getElementsByClass(note.Note).flat.elements\n", + " freqs = [0] + [e.pitch.frequency for e in part]\n", + " durs = [stream[p].getElementsByClass(note.Note).flat[0].offset] + [e.duration.quarterLength * durScale for e in part]\n", + " pBinds.append('PBind'+str(p))\n", + " client.send( OSCMessage('/ins', [pBinds[p],'instrument','difference']))\n", + " client.send( OSCMessage('/bind', [pBinds[p],'freq',freqs]))\n", + " client.send( OSCMessage('/bind', [pBinds[p],'dur',durs]))\n", + " client.send( OSCMessage('/playPPar', [streamName, pBinds]))\n", + " \n", + "def stop_sc(streamName):\n", + " client.send( OSCMessage('/stopPPar', streamName))" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 3 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "tune = corpus.parse('bach/bwv40.8')\n", + "tune.parts" + ], + "language": "python", + "metadata": {}, + "outputs": [ + { + "metadata": {}, + "output_type": "pyout", + "prompt_number": 4, + "text": [ + "" + ] + } + ], + "prompt_number": 4 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "s = stream.Stream()\n", + "l = tune.duration.quarterLength\n", + "t = 0\n", + "mult = 0\n", + "for part in tune.parts:\n", + " p1 = stream.Part()\n", + " p2 = stream.Part()\n", + " for n in part.flat.notes:\n", + " r1 = pitch.Pitch()\n", + " r2 = pitch.Pitch()\n", + " f = n.pitch.frequency\n", + " #print f\n", + " r1.frequency = 3000\n", + " r2.frequency = r1.frequency - f\n", + " d = n.quarterLength\n", + " if n.isRest:\n", + " p1.append(note.Rest(quarterLength = d))\n", + " p2.append(note.Rest(quarterLength = d))\n", + " else:\n", + " p1.append(note.Note(r1, quarterLength = d))\n", + " p2.append(note.Note(r2, quarterLength = d))\n", + " t += d\n", + " s.append(p1)\n", + " s.append(p2)\n", + " mult = mult + 1" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 5 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "play_sc(s[:], \"s\", 1)" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 6 + }, + { + "cell_type": "code", + "collapsed": false, + "input": [ + "stop_sc(\"s\")" + ], + "language": "python", + "metadata": {}, + "outputs": [], + "prompt_number": 7 + } + ], + "metadata": {} + } + ] +} \ No newline at end of file diff --git a/computer_music_study_1/computer_music_study_1_music21_Link.scd b/computer_music_study_1/computer_music_study_1_music21_Link.scd new file mode 100644 index 0000000..c17fe67 --- /dev/null +++ b/computer_music_study_1/computer_music_study_1_music21_Link.scd @@ -0,0 +1,52 @@ +( +~oscListeners.do({ arg item, i; ~oscListeners[i].free}); +~oscListeners = List.new; + +~streams.do({ arg item, i; ~oscListeners[i].stop}); +~streams = Dictionary.new; + +~oscListeners.add( + OSCFunc({ |msg, time, addr | + msg.postln; + Pbindef(msg[1].asSymbol, msg[2].asSymbol,Pseq(msg[3..])); + Pbindef('PBind0','\bufnum',e.bufnum); + }, '/bind' ); +); +~oscListeners.add( + OSCFunc({ |msg, time, addr | + msg.postln; + Pbindef(msg[1].asSymbol,'instrument',msg[3].asSymbol); + Pbindef(msg[1].asSymbol,'\bufnum',e.bufnum); + }, '/ins' ); +); +~oscListeners.add( + OSCFunc({ |msg, time, addr | + msg.postln; + Pbindef(msg[1].asSymbol).playOnce; + }, '/playPBind' ); +); +~oscListeners.add( + OSCFunc({ |msg, time, addr | + msg.postln; + (all {: m.asSymbol, m <- msg[2..] }).postln; + ~streams.put(msg[1], Ppar(all {: Pdef(m.asSymbol), m <- msg[2..] }).play); + }, '/playPPar' ); +); +~oscListeners.add( + OSCFunc({ |msg, time, addr | + msg.postln; + ~streams.at(msg[1]).stop; + }, '/stopPPar' ); +); +) + +( +e = Buffer.alloc(s, 512, 1); +e.sine1(1.0, true, true, true); + +SynthDef(\difference, { |dur = 1, outbus = 0, bufnum = 0, freq = 440, amp = 1, gate = 1| + var out; + out = EnvGen.ar(Env.adsr(sustainLevel:1), gate, doneAction: 2) * amp * Osc.ar(e.bufnum, freq, 0, 1, 0); + Out.ar(outbus, out ! 2); +}).add; +) diff --git a/computer_music_study_2/computer_music_study_2.scd b/computer_music_study_2/computer_music_study_2.scd new file mode 100644 index 0000000..be44980 --- /dev/null +++ b/computer_music_study_2/computer_music_study_2.scd @@ -0,0 +1,10 @@ +( +a = Buffer.read(s, "/home/mwinter/room_ambience.wav"); //buffer of recording of the ambient noise; replace accordingly +) + + +( +SynthDef("help-Select",{ arg out=0; + Out.ar([0,1], Clip.ar(PlayBuf.ar(1, a, 1) * pow(Line.ar(0,1, 60 * 3.5, doneAction: 2), 3) * 2000, 0, 1)); +}).play; +) \ No newline at end of file diff --git a/computer_music_study_3/computer_music_study_3.scd b/computer_music_study_3/computer_music_study_3.scd new file mode 100644 index 0000000..9288c1e --- /dev/null +++ b/computer_music_study_3/computer_music_study_3.scd @@ -0,0 +1,132 @@ +/*The field recordings are hardcoded such that buffers a and b are the drone and c and d are the birds. +This should eventually change to pointing to folders but that would require a rework of the GUI. +Also, I have been performing the fade manually hence the code for the automated fade being commented out. +*/ +( +a = Buffer.read(s, "/home/mwinter/Portfolio/fade_and_aviary/harmonium_fifth_final_norm_mono.wav"); +b = Buffer.read(s, "/home/mwinter/Portfolio/fade_and_aviary/gong_final_norm_mono.wav"); +c = Buffer.read(s, "/home/mwinter/Portfolio/fade_and_aviary/birds_wulf_norm_mono.wav"); +d = Buffer.read(s, "/home/mwinter/Portfolio/fade_and_aviary/birds_norm_mono.wav"); +) +( +w = 100; +l = 30; +m = 5; +f = Array.fill(l, { arg i; (i + 1) * w }); +q = w/f; +SynthDef("switch", { + arg out=0, soundBufnum1=0, soundBufnum2 = 1, soundBufnum3 = 2, soundBufnum4 = 3, att = 0.1, rel = 0.01, dust = 0.5, prob = 0.7, + ctlin = #[0,0,0,0,0,0,0,0,0,0]; + var fadeOut, fadeIn, + soundInA, soundInB, + inA, inB, inC, inD, + filtA, filtB, + trig, res, + gTrigA, gTrigB, + grainA, grainB, + imp, delimp; + + fadeOut = Line.ar(1, 0, m * 60); + fadeIn = Line.ar(0, 0.75, 10); + Poll.ar(Impulse.ar(1), fadeOut, \fade); + Poll.ar(Impulse.ar(1), BufFrames.ir(soundBufnum3) - (BufSampleRate.ir(soundBufnum3) * 60 * m), \start); + + //inA = PlayBuf.ar(1, soundBufnum1, BufRateScale.kr(soundBufnum1), loop: 1) * fadeOut; + gTrigA = Dust.kr(2); + grainA = GrainBuf.ar(1, gTrigA, TRand.kr(4, 8, gTrigA), soundBufnum1) /** fadeOut*/; + soundInA = SoundIn.ar(0); + + //inB = PlayBuf.ar(1, soundBufnum2, BufRateScale.kr(soundBufnum2), loop: 1) * fadeOut; + gTrigB = Dust.kr(2); + grainB = GrainBuf.ar(1, gTrigB, TRand.kr(4, 8, gTrigB), soundBufnum2) /** fadeOut*/; + soundInB = SoundIn.ar(1); + + inA = (grainA * ctlin[0]) + (soundInA * ctlin[2]); + inB = (grainB * ctlin[1]) + (soundInB * ctlin[3]); + inC = PlayBuf.ar(1, soundBufnum3, BufRateScale.kr(soundBufnum3), + startPos: BufFrames.kr(soundBufnum3) - (BufSampleRate.kr(soundBufnum3) * 60 * (m + 1.5)), loop: 1) * ctlin[4] * fadeIn * 10; + inD = PlayBuf.ar(1, soundBufnum4, BufRateScale.kr(soundBufnum3)) * ctlin[4] * fadeIn * 8; + + filtA = BPF.ar(inA, f, q); + filtB = BPF.ar(inB, f, q); + + trig = { Dust.ar(dust) } ! l; + res = {|i| Lag.ar(LeakDC.ar(Select.ar(TRand.ar(0, 1, trig[i]) > prob, [Normalizer.ar(filtA[i], Amplitude.ar(inA), 0.1), filtB[i]]), 1), 0.001)} ! l; + res = Mix.new(res); + res = Lag.ar(LeakDC.ar(Select.ar((Amplitude.ar(inC, att, rel) < Amplitude.ar(res, att, rel)), [(inC + inD) * 2, Normalizer.ar(res, 0.5, 0.1)])), 0.001); + + Out.ar([0, 1], + ( + (grainA * ctlin[5]) + + (grainB * ctlin[6]) + + + (soundInA * ctlin[7]) + + (soundInB * ctlin[8]) + + + (res * ctlin[9]) + ) * fadeIn + ); + + + imp = Impulse.kr(10); + delimp = Delay1.kr(imp); + + SendReply.kr(imp, + '/levels', + values: [ + //ins + + [Amplitude.kr(grainA * ctlin[0]), K2A.ar(Peak.ar(grainA * ctlin[0], delimp).lag(0, 3))], + [Amplitude.kr(grainB * ctlin[1]), K2A.ar(Peak.ar(grainB * ctlin[1], delimp).lag(0, 3))], + + [Amplitude.kr(soundInA * ctlin[2]), K2A.ar(Peak.ar(soundInA * ctlin[2], delimp).lag(0, 3))], + [Amplitude.kr(soundInB * ctlin[3]), K2A.ar(Peak.ar(soundInB * ctlin[3], delimp).lag(0, 3))], + + [Amplitude.kr(inC), K2A.ar(Peak.ar(inC, delimp).lag(0, 3))], + + //outs + [Amplitude.kr(grainA * ctlin[5]), K2A.ar(Peak.ar(grainA * ctlin[5], delimp).lag(0, 3))], + [Amplitude.kr(grainB * ctlin[6]), K2A.ar(Peak.ar(grainB * ctlin[6], delimp).lag(0, 3))], + + [Amplitude.kr(soundInA * ctlin[7]), K2A.ar(Peak.ar(soundInA * ctlin[7], delimp).lag(0, 3))], + [Amplitude.kr(soundInB * ctlin[8]), K2A.ar(Peak.ar(soundInB * ctlin[8], delimp).lag(0, 3))], + + [Amplitude.kr(res * ctlin[9]), K2A.ar(Peak.ar(res * ctlin[9], delimp).lag(0, 3))] + ], + replyID: [1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909] + ); + + }).add; +) +( +var synth, win, +levels, levelIndicators, +grainAInLevels, grainBInLevels, soundInALevels, soundInBLevels, +grainAOutLevels, grainBOutLevels, soundOutALevels, soundOutBLevels, resOutLevels; +synth = Synth("switch", [\soundBufnum1, a.bufnum, \soundBufnum2, b.bufnum, \soundBufnum3, c.bufnum, \soundBufnum4, d.bufnum]); + +win = Window.new("fade and aviary", Rect(128, 64, 350, 600)); +win.view.decorator = FlowLayout(win.view.bounds); +win.view.decorator.gap=2@2; + +levels = [0,0,0,0,0,0,0,0,0,0]; +levelIndicators = {|i| + var lI; + EZSlider(win, 40 @ 250, "", ControlSpec(0, 1, \lin, 0, 0), + {|v| levels[i] = v.value; synth.set("ctlin", levels )}, layout: 'vert'); + lI = LevelIndicator(win, Rect(10, 10, 20, 250)); + lI} ! 10; + +EZSlider(win, 350 @ 40, "dust freq ", ControlSpec(0.5, 3, \lin, 0, 0.5), {|v| synth.set("dust", v.value )}); +EZSlider(win, 350 @ 40, "spec prob ", ControlSpec(0.1, 0.7, \lin, 0, 0.7), {|v| synth.set("prob", v.value )}); + +o = OSCFunc({arg msg; + { + levelIndicators[msg[2]-1900].value = msg[3].ampdb.linlin(-40, 0, 0, 1); + levelIndicators[msg[2]-1900].peakLevel = msg[4].ampdb.linlin(-40, 0, 0, 1); + }.defer; +}, '/levels', s.addr); + + +win.front; +) \ No newline at end of file diff --git a/computer_music_study_4/computer_music_study_4_processingGUI/allocator.pde b/computer_music_study_4/computer_music_study_4_processingGUI/allocator.pde new file mode 100644 index 0000000..3473f76 --- /dev/null +++ b/computer_music_study_4/computer_music_study_4_processingGUI/allocator.pde @@ -0,0 +1,34 @@ +class Allocator +{ + + ArrayList indices = new ArrayList(); + int initIndex = 0; + + Allocator(int initIndex){ + this.initIndex = initIndex; + for(int i = 0; i < 2056; i++){ + indices.add(-1); + } + + } + + int getNextAvailableIndex(){ + println("here"); + int i = initIndex; + while(indices.get(i - initIndex) != -1){ + i++; + } +// println("-**-"); +// println("----"); + println(i); +// println("----"); +// println("-**-"); + indices.set(i - initIndex, i); + return i; + } + + void freeIndex(int i){ + println("free " + i ); + indices.set(i - initIndex, -1); + } +} diff --git a/computer_music_study_4/computer_music_study_4_processingGUI/delayGraphGui.pde b/computer_music_study_4/computer_music_study_4_processingGUI/delayGraphGui.pde new file mode 100644 index 0000000..258abc0 --- /dev/null +++ b/computer_music_study_4/computer_music_study_4_processingGUI/delayGraphGui.pde @@ -0,0 +1,472 @@ +import processing.opengl.*; +import supercollider.*; +import oscP5.*; +import netP5.*; + +// does removing this input fucking anything else up? +//import java.awt.event.*; + +ArrayList edges = new ArrayList(); +ArrayList vertices = new ArrayList(); +ArrayList path = new ArrayList(); +String data = ""; +ArrayList synthDefNames = new ArrayList(); +Group feedbackGroup; +Group sourceGroup; +Group inputGroup; +Group edgeGroup; +Group outputGroup; +//int windowX = 1280; +//int windowY = 720; +int windowX = 1050; +int windowY = 1050; +String tool = "edit"; +int delayControlMult = 1; + +OscP5 queryTreeOsc; + +Allocator busAllocator = new Allocator(64); +Allocator bufferAllocator = new Allocator(0); + +void setup() { + +// needed for old mousewheel version +// addMouseWheelListener(new MouseWheelListener() { +// public void mouseWheelMoved(MouseWheelEvent mwe) { +// mouseWheel(mwe.getWheelRotation()); +// }}); + + Server.local.default_group.freeAll(); + + feedbackGroup = new Group(); + sourceGroup = new Group(); + inputGroup = new Group(); + edgeGroup = new Group(); + outputGroup = new Group(); + + feedbackGroup.addToTail(); + sourceGroup.addToTail(); + inputGroup.addToTail(); + edgeGroup.addToTail(); + outputGroup.addToTail(); + + size(windowX, windowY, OPENGL); + + queryTreeOsc = new OscP5(this, 57151); + queryTreeOsc.properties().setSRSP(OscProperties.ON); + + synthDefNames.add("none"); + +} + +void exit(){ + Server.local.default_group.freeAll(); +} + +void oscEvent(OscMessage msg) { + for(int i = 0; i < msg.typetag().length(); i++){ + String val = msg.get(i).stringValue(); + synthDefNames.add(val); + println(val); + } +} + +void draw() { + + background(0); + noStroke(); + + fill(0, 51, 102); + ambientLight(102, 102, 102); + lightSpecular(204, 204, 204); + directionalLight(102, 102, 102, 0, 0, -1); + specular(255, 255, 255); + + for (int i = 0; i < vertices.size(); i++) { + vertices.get(i).display(); + } + + for (int i = 0; i < edges.size(); i++) { + edges.get(i).display(); + } + + updateDataDisplay(); + //text(data, 15, 30); + + //text((synthDefNames), windowX - 115, 30); + textSize(20); + text(data, 15, 200); + text(getFormattedSynthDefNames(synthDefNames), windowX - 200, 200); + + if(mouseX < 50) { + cursor(CROSS); + } else { + cursor(HAND); + } +} + +void mousePressed() { + + Vertex mouseOverVertex = getMouseOverVertex(); + + if(mouseOverVertex == null && keyCode == SHIFT && keyPressed && tool == "edit"){ + Vertex vertex = new Vertex(mouseX, mouseY, busAllocator); + vertex.startFeedbackSynth(feedbackGroup); + vertex.setSelected(true); + vertices.add(vertex); + } else if(mouseOverVertex != null && keyCode == SHIFT && keyPressed && tool == "edit"){ + removeVertex(mouseOverVertex); + } else if(mouseOverVertex != null){ + if(mouseOverVertex.isSelected()){ + mouseOverVertex.setSelected(false); + } else { + mouseOverVertex.setSelected(true); + } + } else if(tool == "path"){ + for(int i = 0; i < vertices.size(); i++) { + vertices.get(i).setSelected(false); + } + path = new ArrayList(); + } +} + +void mouseReleased() { + if(tool == "path" && keyCode != SHIFT){ + for(int i = 0; i < vertices.size(); i++) { + vertices.get(i).setSelected(false); + } + } +} + +void mouseMoved() { +} + +void mouseDragged(){ + Vertex mouseOverVertex = getMouseOverVertex(); + if(tool == "move"){ + ArrayList selectedVertices = getSelectedVertices(); + for(int i = 0; i < selectedVertices.size(); i++){ + PVector mouseVector = new PVector(mouseX, mouseY); + PVector lastMouseVector = new PVector(pmouseX, pmouseY); + selectedVertices.get(i).add(PVector.sub(mouseVector, lastMouseVector)); + } + } else if(tool == "path" && !keyPressed){ + if(path.size() == 0 && mouseOverVertex != null){ + mouseOverVertex.setSelected(true); + path.add(mouseOverVertex); + } else if (mouseOverVertex != null) { + mouseOverVertex.setSelected(true); + path.add(mouseOverVertex); + Vertex outVertex = path.get(path.size()-2); + Vertex inVertex = path.get(path.size()-1); + Edge edge = new Edge(outVertex, inVertex, bufferAllocator); + if(outVertex != inVertex && !edges.contains(edge)){ + edge.startSynth(edgeGroup); + edges.add(edge); + } + } + } else if(tool == "path" && keyPressed && key == CODED && keyCode == SHIFT){ + if(path.size() == 0 && mouseOverVertex != null){ + mouseOverVertex.setSelected(true); + path.add(mouseOverVertex); + } else if (mouseOverVertex != null){ + mouseOverVertex.setSelected(true); + path.add(mouseOverVertex); + Vertex outVertex = path.get(path.size()-2); + Vertex inVertex = path.get(path.size()-1); + Edge edge = new Edge(outVertex, inVertex, bufferAllocator); + if(outVertex != inVertex && edges.contains(edge)){ + edge = edges.get(edges.indexOf(edge)); + edge.stopSynth(); + edges.remove(edge); + } + } + } +} + +void keyPressed(){ + + Vertex mouseOverVertex = getMouseOverVertex(); + ArrayList selectedVertices = getSelectedVertices(); + + if (key == 'p'){ + tool = "path"; + } else if (key == 'e'){ + tool = "edit"; + } else if (key == 'm'){ + tool = "move"; + } else if (key == 'g'){ + tool = "global"; + } else if (key == 'c'){ + for(int i = 0; i < selectedVertices.size(); i++) { + for(int j = 0; j < selectedVertices.size(); j++) { + Edge edge = new Edge(selectedVertices.get(i), selectedVertices.get(j), bufferAllocator); + if(i != j && !edges.contains(edge)){ + edge.startSynth(edgeGroup); + edges.add(edge); + } + } + } + } else if(key == 'd'){ + for(int i = 0; i < vertices.size(); i++) { + vertices.get(i).setSelected(false); + } + } else if(key == 'a'){ + for(int i = 0; i < vertices.size(); i++) { + vertices.get(i).setSelected(true); + } + } else if(key == '-'){ + delayControlMult = constrain(delayControlMult - 1, 1, 10); + } else if(key == '='){ + delayControlMult = constrain(delayControlMult + 1, 1, 10); + } else if(key == 'i'){ + saveFrame("/home/mwinter/delayGraphImages/delayGraph-######.png"); + } else if(keyCode == BACKSPACE){ + for(int i = 0; i < selectedVertices.size(); i++){ + removeVertex(selectedVertices.get(i)); + } + } else if(mouseOverVertex != null && isInteger(key)){ + int i = Character.getNumericValue(key); + if(mouseOverVertex.x > mouseX){ + if(i == 0){ + mouseOverVertex.stopSourceAndInputSynths(); + } else { + println(synthDefNames.get(i)); + mouseOverVertex.startSourceAndInputSynths(synthDefNames.get(i), sourceGroup, inputGroup); + } + } else{ + if(i == 0){ + mouseOverVertex.stopOutputSynth(); + } else { + mouseOverVertex.startOutputSynth(i - 1, outputGroup); + } + } + } +} + +void removeVertex(Vertex v){ + int i = 0; + while(i < edges.size()){ + Edge edge = edges.get(i); + if(edge.getInVertex() == v || edge.getOutVertex() == v){ + edge.stopSynth(); + edges.remove(edge); + } else{ + i++; + } + } + v.stopAllSynths(); + vertices.remove(v); +} + +Edge getMouseOverEdge(){ + Edge mouseOverEdge = null; + for(int i = 0; i < edges.size(); i++) { + if(edges.get(i).isMouseOver()){ + mouseOverEdge = edges.get(i); + break; + } + } + return mouseOverEdge; +} + +Vertex getMouseOverVertex(){ + Vertex mouseOverVertex = null; + for(int i = 0; i < vertices.size(); i++) { + if(vertices.get(i).isMouseOver()){ + mouseOverVertex = vertices.get(i); + break; + } + } + return mouseOverVertex; +} + +ArrayList getSelectedVertices(){ + ArrayList selectedVertices = new ArrayList(); + for(int i = 0; i < vertices.size(); i++) { + if(vertices.get(i).isSelected()){ + selectedVertices.add(vertices.get(i)); + } + } + return selectedVertices; +} + +public boolean isInteger( char i ) { + try { + Integer.parseInt( String.valueOf(i) ); + return true; + } catch(Exception e) { + return false; + } +} + +void updateDataDisplay(){ + Vertex mouseOverVertex = getMouseOverVertex(); + Edge mouseOverEdge = getMouseOverEdge(); + if(mouseOverVertex != null){ + String outputString; + if(mouseOverVertex.getOutputBusIndex() == -1){ + outputString = "none"; + } else { + outputString = (mouseOverVertex.getOutputBusIndex() + 1) + ""; + } + data = "input: " + mouseOverVertex.getInput() + "\nouput: " + outputString + + "\ninput mod: " + mouseOverVertex.getInputMod() + "\noutput mod: " + mouseOverVertex.getOutputMod(); + } else if(mouseOverEdge != null){ + String mouseOverEdgeDir = ""; + if(mouseOverEdge.getOutVertex().x < mouseOverEdge.getInVertex().x){ + mouseOverEdgeDir = "->"; + } else { + mouseOverEdgeDir = "<-"; + } + String data1 = mouseOverEdgeDir + "\ndelay time: " + mouseOverEdge.getDelayTime() + "\nmod: " + mouseOverEdge.getMod(); + String data2 = ""; + + Edge sharedEdge = getSharedEdge(edges, mouseOverEdge); + if(sharedEdge != null){ + String sharedEdgeDir = ""; + if(sharedEdge.getOutVertex().x < sharedEdge.getInVertex().x){ + sharedEdgeDir = "->"; + } else { + sharedEdgeDir = "<-"; + } + data2 = sharedEdgeDir + "\ndelay time: " + sharedEdge.getDelayTime() + "\nmod: " + sharedEdge.getMod(); + } + data = data1 + "\n" + data2; + } else { + data = ""; + } +} + +String getFormattedSynthDefNames(ArrayList s){ + String res = "synth definitions:\n"; + for(int i = 0; i < s.size(); i++){ + res = res + i + ") " + s.get(i) + "\n"; + } + return res; +} + +Edge getSharedEdge(ArrayList e, Edge edge){ + if(edge == null || e == null || e.size() < 1){ + return null; + } + + for(int i = 0; i < e.size(); i++) { + if(edge.getOutVertex() == e.get(i).getInVertex() && edge.getInVertex() == e.get(i).getOutVertex()){ + return e.get(i); + } + } + + return null; +} + +void mouseWheel(MouseEvent me) { + Vertex mouseOverVertex = getMouseOverVertex(); + Edge mouseOverEdge = getMouseOverEdge(); + Edge sharedEdge = getSharedEdge(edges, mouseOverEdge); + int delta = (int) me.getAmount(); + if(tool == "edit" && mouseOverVertex != null){ + if(mouseOverVertex.x > mouseX){ + mouseOverVertex.setInputMod(constrain(mouseOverVertex.getInputMod() - delta, 1, 64)); + } else{ + mouseOverVertex.setOutputMod(constrain(mouseOverVertex.getOutputMod() - delta, 1, 64)); + } + } else if(tool == "edit" && mouseOverEdge != null && mouseOverEdge.isMouseOverMod()){ + mouseOverEdge.setMod(constrain(mouseOverEdge.getMod() - delta, 1, 64)); + } else if(tool == "edit" && mouseOverEdge != null && mouseOverEdge.isMouseOverDelayTime()){ + mouseOverEdge.setDelayTime(constrain(mouseOverEdge.getDelayTime() - delta/pow(10.,delayControlMult), 0, mouseOverEdge.getMaxDelayTime())); + } else if(tool == "edit" && sharedEdge != null && sharedEdge.isMouseOverMod()){ + sharedEdge.setMod(constrain(sharedEdge.getMod() - delta, 1, 64)); + } else if(tool == "edit" && sharedEdge != null && sharedEdge.isMouseOverDelayTime()){ + sharedEdge.setDelayTime(constrain(sharedEdge.getDelayTime() - delta/pow(10.,delayControlMult), 0, mouseOverEdge.getMaxDelayTime())); + } else if(tool == "global"){ + if(windowX/2 > mouseX){ + for(int i = 0; i < edges.size(); i++){ + edges.get(i).setMod(constrain(edges.get(i).getMod() - delta, 1, 64)); + } + } else{ + for(int i = 0; i < edges.size(); i++){ + edges.get(i).setDelayTime(constrain(edges.get(i).getDelayTime() - delta/pow(10.,delayControlMult) , 0, 11.8886)); + } + } + } +} + + +//old mousewheel version +//void mouseWheel(MouseEvent me) { +// Vertex mouseOverVertex = getMouseOverVertex(); +// Edge mouseOverEdge = getMouseOverEdge(); +// Edge sharedEdge = getSharedEdge(edges, mouseOverEdge); +// int delta = (int) me.getAmount(); +// if(tool == "edit" && mouseOverVertex != null){ +// if(mouseOverVertex.x > mouseX){ +// mouseOverVertex.setInputMod(constrain(mouseOverVertex.getInputMod() - delta/2, 1, 64)); +// } else{ +// mouseOverVertex.setOutputMod(constrain(mouseOverVertex.getOutputMod() - delta/2, 1, 64)); +// } +// } else if(tool == "edit" && mouseOverEdge != null && mouseOverEdge.isMouseOverMod()){ +// mouseOverEdge.setMod(constrain(mouseOverEdge.getMod() - delta/2, 1, 64)); +// } else if(tool == "edit" && mouseOverEdge != null && mouseOverEdge.isMouseOverDelayTime()){ +// mouseOverEdge.setDelayTime(constrain(mouseOverEdge.getDelayTime() - delta/1000., 0, mouseOverEdge.getMaxDelayTime())); +// } else if(tool == "edit" && sharedEdge != null && sharedEdge.isMouseOverMod()){ +// sharedEdge.setMod(constrain(sharedEdge.getMod() - delta/2, 1, 64)); +// } else if(tool == "edit" && sharedEdge != null && sharedEdge.isMouseOverDelayTime()){ +// sharedEdge.setDelayTime(constrain(sharedEdge.getDelayTime() - delta/1000., 0, mouseOverEdge.getMaxDelayTime())); +// } else if(tool == "global"){ +// if(windowX/2 > mouseX){ +// for(int i = 0; i < edges.size(); i++){ +// edges.get(i).setMod(constrain(edges.get(i).getMod() - delta/2, 1, 64)); +// } +// } else{ +// for(int i = 0; i < edges.size(); i++){ +// edges.get(i).setDelayTime(constrain(edges.get(i).getDelayTime() - delta/1000., 0, 11.8886)); +// } +// } +// } +//} + +//Vertex getNearestVertex(ArrayList v, float x, float y){ +// if(v.size() == 0){ +// return null; +// } +// +// Vertex nearestVertex = v.get(0); +// float distanceToNearestVertex = dist(nearestVertex.x, nearestVertex.y, x, y); +// for(int i = 1; i < v.size(); i++) { +// Vertex curVertex = v.get(i); +// float curDistance = dist(curVertex.x, curVertex.y, x, y); +//// println("i = " + i + ", curD = " + curDistance + ", x = " + x + ", y = " + y); +// if(curDistance < distanceToNearestVertex){ +// nearestVertex = curVertex; +// distanceToNearestVertex = curDistance; +// } +// } +// return nearestVertex; +//} +// +//float edgeDist(Edge e, float x, float y){ +// float distance = dist(e.getOutVertex().x, e.getOutVertex().y, x, y) + +// dist(x, y, e.getInVertex().x, e.getInVertex().y) - +// dist(e.getOutVertex().x, e.getOutVertex().y, e.getInVertex().x, e.getInVertex().y); +// return distance; +//} +// +//Edge getNearestEdge(ArrayList e, float x, float y){ +// if(e.size() == 0){ +// return null; +// } +// +// Edge nearestEdge = e.get(0); +// float distanceToNearestEdge = edgeDist(nearestEdge, x, y); +// for(int i = 1; i < e.size(); i++) { +// Edge curEdge = e.get(i); +// float curDistance = edgeDist(curEdge, x, y); +//// println("i = " + i + ", curD = " + curDistance + ", x = " + x + ", y = " + y); +// if(curDistance < distanceToNearestEdge){ +// nearestEdge = curEdge; +// distanceToNearestEdge = curDistance; +// } +// } +// return nearestEdge; +//} diff --git a/computer_music_study_4/computer_music_study_4_processingGUI/edge.pde b/computer_music_study_4/computer_music_study_4_processingGUI/edge.pde new file mode 100644 index 0000000..02f9d2f --- /dev/null +++ b/computer_music_study_4/computer_music_study_4_processingGUI/edge.pde @@ -0,0 +1,253 @@ +class Edge +{ + private Vertex inVertex; + private Vertex outVertex; + private float velocity; + private float distance; + private float delayTime; + private float maxDelayTime = 11.8886; + private int mod; + private Synth edgeSynth; + private int bufferIndex; + Allocator bufferAllocator; + + Edge(Vertex outVertex, Vertex inVertex, Allocator b){ + this.inVertex = inVertex; + this.outVertex = outVertex; + bufferAllocator = b; + distance = 0; + mod = floor(random(0, 1) * 64); + delayTime = random(.01, maxDelayTime); + } + + void display() { + + PVector dir = PVector.sub(outVertex, inVertex); + float r = sqrt(dir.x*dir.x+dir.y*dir.y+dir.z*dir.z); + float theta = atan2(dir.y,dir.x); + float phi = acos(dir.z/r); + float angle = atan2(outVertex.y-inVertex.y, outVertex.x-inVertex.x); + + float vDist = PVector.dist(inVertex, outVertex); + + distance += abs(delayTime - 1) * 1/60. + 1/60.; + dir.mult(distance); + PVector location = PVector.sub(outVertex, dir); + + if(distance + abs(delayTime-1) * 1/60. + 1/60. > 1) { + distance = 0; + } + + pushMatrix(); + + shininess(10.0); + + translate(location.x, location.y, 0); + sphere(5); + translate(-location.x, -location.y, 0); + + translate(outVertex.x, outVertex.y, outVertex.z); + rotateZ(theta); + rotateY(phi); + rotateX(-HALF_PI); + cylinder(1, vDist, 10); + translate(-outVertex.x, -outVertex.y, -outVertex.z); + + popMatrix(); + } + + public boolean isMouseOver(){ + if(edgeDist(this, mouseX, mouseY) <= 4){ + return true; + } else{ + return false; + } + } + + public boolean isMouseOverMod(){ + if(modDist(this, mouseX, mouseY) <= 4){ + return true; + } else{ + return false; + } + } + + public boolean isMouseOverDelayTime(){ + if(delayTimeDist(this, mouseX, mouseY) <= 4){ + return true; + } else{ + return false; + } + } + + float edgeDist(Edge e, float x, float y){ + float distance = dist(e.getOutVertex().x, e.getOutVertex().y, x, y) + + dist(x, y, e.getInVertex().x, e.getInVertex().y) - + dist(e.getOutVertex().x, e.getOutVertex().y, e.getInVertex().x, e.getInVertex().y); + return distance; + } + + float modDist(Edge e, float x, float y){ + float midMidPointX=e.getOutVertex().x+((e.getInVertex().x-e.getOutVertex().x)/4.0); + float midMidPointY=e.getOutVertex().y+((e.getInVertex().y-e.getOutVertex().y)/4.0); + float distance = dist(e.getOutVertex().x, e.getOutVertex().y, x, y) + + dist(x, y, midMidPointX, midMidPointY) - + dist(e.getOutVertex().x, e.getOutVertex().y, midMidPointX, midMidPointY); + return distance; + } + + float delayTimeDist(Edge e, float x, float y){ + float midPointX=e.getOutVertex().x+((e.getInVertex().x-e.getOutVertex().x)/2.0); + float midPointY=e.getOutVertex().y+((e.getInVertex().y-e.getOutVertex().y)/2.0); + float midMidPointX=e.getOutVertex().x+((e.getInVertex().x-e.getOutVertex().x)/4.0); + float midMidPointY=e.getOutVertex().y+((e.getInVertex().y-e.getOutVertex().y)/4.0); + float distance = dist(midMidPointX, midMidPointY, x, y) + + dist(x, y, midPointX, midPointY) - + dist(midPointX, midPointY, midMidPointX, midMidPointY); + return distance; + } + + public boolean equals(Object obj){ + if(this.getInVertex() == ((Edge) obj).getInVertex() && this.outVertex == ((Edge) obj).getOutVertex()){ + return true; + } else { + return false; + } + } + + void setInVertex(Vertex inVertex){ + this.inVertex = inVertex; + } + + void setOutVertex(Vertex outVertex){ + this.outVertex = outVertex; + } + + Vertex getInVertex(){ + return inVertex; + } + + Vertex getOutVertex(){ + return outVertex; + } + + void setMod(int m){ + if(edgeSynth != null){ + edgeSynth.set("mod", pow(2,m)); + } + mod = m; + } + + int getMod(){ + return mod; + } + + void setDelayTime(float d){ + if(edgeSynth != null){ + edgeSynth.set("delayTime", d); + } + delayTime = d; + } + + float getDelayTime(){ + return delayTime; + } + + void setMaxDelayTime(float d){ + if(edgeSynth != null){ + edgeSynth.set("maxDelayTime", d); + } + maxDelayTime = d; + } + + float getMaxDelayTime(){ + return maxDelayTime; + } + + void startSynth(Group g){ + edgeSynth = new Synth("edge"); + + allocBuffer(); + edgeSynth.set("buffer", bufferIndex); + + edgeSynth.set("busIn", outVertex.getFeedbackOutBusIndex()); + edgeSynth.set("busOut", inVertex.getFeedbackInBusIndex()); + edgeSynth.set("mod", getMod()); + edgeSynth.set("maxDelayTime", getMaxDelayTime()); + edgeSynth.set("delayTime", delayTime); + edgeSynth.addToTail(g); + } + + void stopSynth(){ + edgeSynth.free(); + freeBuffer(); + } + + void allocBuffer(){ + bufferIndex = bufferAllocator.getNextAvailableIndex(); + int frames = 524288; + int channels = 1; + OscMessage msg = new OscMessage("/b_alloc"); + msg.add(bufferIndex); + msg.add(frames); + msg.add(channels); + Server.osc.send(msg, Server.local.addr); + } + + void freeBuffer(){ + bufferAllocator.freeIndex(bufferIndex); + OscMessage msg = new OscMessage("/b_free"); + msg.add(bufferIndex); + Server.osc.send(msg, Server.local.addr); + } + +/** +cylinder taken from http://wiki.processing.org/index.php/Cylinder +@author matt ditton +*/ + +void cylinder(float w, float h, int sides){ + float angle; + float[] x = new float[sides+1]; + float[] z = new float[sides+1]; + + //get the x and z position on a circle for all the sides + for(int i=0; i < x.length; i++){ + angle = TWO_PI / (sides) * i; + x[i] = sin(angle) * w; + z[i] = cos(angle) * w; + } + + //draw the top of the cylinder + beginShape(TRIANGLE_FAN); + + vertex(0, 0, 0); + + for(int i=0; i < x.length; i++){ + vertex(x[i], 0, z[i]); + } + + endShape(); + + //draw the center of the cylinder + beginShape(QUAD_STRIP); + + for(int i=0; i < x.length; i++){ + vertex(x[i], 0, z[i]); + vertex(x[i], h, z[i]); + } + + endShape(); + + //draw the bottom of the cylinder + beginShape(TRIANGLE_FAN); + + vertex(0, h, 0); + + for(int i=0; i < x.length; i++){ + vertex(x[i], h, z[i]); + } + + endShape(); +} +} diff --git a/computer_music_study_4/computer_music_study_4_processingGUI/vertex.pde b/computer_music_study_4/computer_music_study_4_processingGUI/vertex.pde new file mode 100644 index 0000000..fc05d88 --- /dev/null +++ b/computer_music_study_4/computer_music_study_4_processingGUI/vertex.pde @@ -0,0 +1,238 @@ +class Vertex extends PVector +{ + private boolean selectFlag = false; + private PVector mouseVector; + + private String input = "none"; + private int outputBusIndex = -1; + + private int inputMod; + private int outputMod; + + Synth sourceSynth; + Synth inputSynth; + Synth feedbackSynth; + Synth outputSynth; + +// private Bus sourceBus; +// private Bus feedbackInBus; +// private Bus feedbackOutBus; + + private int sourceBusIndex; + private int feedbackInBusIndex; + private int feedbackOutBusIndex; + + Allocator busAllocator; + + Vertex(float x, float y, Allocator b){ + this.x = x; + this.y = y; + this.busAllocator = b; + inputMod = floor(random(0, 1) * 64); + outputMod = floor(random(0, 1) * 64); +// println("source bus: " + sourceBus.index); +// println("feedback out bus: " + feedbackOutBus.index); +// input = (int) random(-1,8); +// output =(int) random(-1,8); + } + + void display() { + pushMatrix(); + translate(x, y, 0); + if(isSelected()){ + shininess(1.0); + } else { + shininess(10.0); + } + sphere(10); + popMatrix(); + } + + public boolean isMouseOver(){ + PVector mousePos = new PVector(mouseX, mouseY); + if( PVector.dist(this, mousePos) <= 10){ + return true; + } else { + return false; + } + } + + void setSelected(boolean b){ + selectFlag = b; + } + + boolean isSelected(){ + return selectFlag; + } + + void setMouseVector(PVector v){ + mouseVector = v; + } + + PVector getMouseVector(){ + return mouseVector; + } + + void setInput(String i){ + input = i; + } + + String getInput(){ + return input; + } + + void setInputMod(int m){ + if(inputSynth != null){ + inputSynth.set("mod", pow(2,m)); + } + inputMod = m; + } + + int getInputMod(){ + return inputMod; + } + + void setOutputMod(int m){ + if(outputSynth != null){ + outputSynth.set("mod", pow(2,m)); + } + outputMod = m; + } + + int getOutputMod(){ + return outputMod; + } + + int getSourceBusIndex(){ +// return sourceBus.index; + return sourceBusIndex; + } + + + int getFeedbackInBusIndex(){ +// return feedbackInBus.index; + return feedbackInBusIndex; + } + + int getFeedbackOutBusIndex(){ +// return feedbackOutBus.index; + return feedbackOutBusIndex; + } + + void setSourceBusIndex(int i){ + sourceBusIndex = i; + } + + void setFeedbackInBusIndex(int i){ + feedbackInBusIndex = i; + } + + void setFeedbackOutBusIndex(int i){ + feedbackOutBusIndex = i; + } + + int getOutputBusIndex(){ + return outputBusIndex; + } + + void setOutputBusIndex(int i){ + outputBusIndex = i; + } + + void startFeedbackSynth(Group feedbackGroup){ + stopFeedbackSynth(); + +// feedbackInBus = new Bus(); + setFeedbackInBusIndex(busAllocator.getNextAvailableIndex()); +// println(getFeedbackInBusIndex()); +// feedbackOutBus = new Bus(); + setFeedbackOutBusIndex(busAllocator.getNextAvailableIndex()); + + feedbackSynth = new Synth("feedback"); + feedbackSynth.set("busIn", getFeedbackInBusIndex()); + feedbackSynth.set("busOut", getFeedbackOutBusIndex()); + feedbackSynth.addToTail(feedbackGroup); + } + + void startSourceAndInputSynths(String syhthDefName, Group sourceGroup, Group inputGroup){ + stopSourceAndInputSynths(); +// sourceBus = new Bus(); + setSourceBusIndex(busAllocator.getNextAvailableIndex()); + +// println(getSourceBusIndex()); + startSourceSynth(syhthDefName, sourceGroup); + startInputSynth(inputGroup); + } + + void startSourceSynth(String syhthDefName, Group sourceGroup){ + stopSourceSynth(); + input = syhthDefName; + sourceSynth = new Synth(syhthDefName); + sourceSynth.set("busOut", getSourceBusIndex()); + sourceSynth.addToTail(sourceGroup); + } + + void startInputSynth(Group inputGroup){ + stopInputSynth(); + inputSynth = new Synth("input"); + inputSynth.set("busIn", getSourceBusIndex()); + inputSynth.set("busOut", getFeedbackInBusIndex()); + inputSynth.set("mod", inputMod); + inputSynth.addToTail(inputGroup); + } + + void startOutputSynth(int i, Group outputGroup){ + stopOutputSynth(); + setOutputBusIndex(i); + outputSynth = new Synth("output"); + outputSynth.set("busIn", getFeedbackOutBusIndex()); + outputSynth.set("busOut", getOutputBusIndex()); + outputSynth.set("mod", outputMod); + outputSynth.addToTail(outputGroup); + } + + void stopSourceAndInputSynths(){ + stopSourceSynth(); + stopInputSynth(); + } + + void stopSourceSynth(){ + if(sourceSynth != null){ + input = "none"; + sourceSynth.free(); +// sourceBus.free(); + busAllocator.freeIndex(getSourceBusIndex()); + } + } + + void stopInputSynth(){ + if(inputSynth != null){ + inputSynth.free(); + } + } + + void stopFeedbackSynth(){ + if(feedbackSynth != null){ + feedbackSynth.free(); +// feedbackInBus.free(); +// feedbackOutBus.free(); + busAllocator.freeIndex(getFeedbackInBusIndex()); + busAllocator.freeIndex(getFeedbackOutBusIndex()); + } + } + + void stopOutputSynth(){ + if(outputSynth != null){ + setOutputBusIndex(-1); + outputSynth.free(); + } + } + + void stopAllSynths(){ + stopSourceSynth(); + stopInputSynth(); + stopFeedbackSynth(); + stopOutputSynth(); + } + +} diff --git a/computer_music_study_4/computer_music_study_4_synthDefs.scd b/computer_music_study_4/computer_music_study_4_synthDefs.scd new file mode 100644 index 0000000..d879716 --- /dev/null +++ b/computer_music_study_4/computer_music_study_4_synthDefs.scd @@ -0,0 +1,89 @@ +( +SynthDef("sine_20", { + arg freq = 20, busOut = 1; + Out.ar(busOut, SinOsc.ar(freq, 0, 1)); + }).send(s); + +SynthDef("sine_30", { + arg freq = 30, busOut = 1; + Out.ar(busOut, SinOsc.ar(freq, 0, 1)); + }).send(s); + +SynthDef("sine_40", { + arg freq = 40, busOut = 1; + Out.ar(busOut, SinOsc.ar(freq, 0, 1)); + }).send(s); + +SynthDef("sine_50", { + arg freq = 50, busOut = 1; + Out.ar(busOut, SinOsc.ar(freq, 0, 1)); + }).send(s); + +SynthDef("sine_60", { + arg freq = 60, busOut = 1; + Out.ar(busOut, SinOsc.ar(freq, 0, 1)); + }).send(s); + +SynthDef("click", { + arg busOut = 1; + Out.ar(busOut,Impulse.ar(1,0,1)); + }).send(s); + +SynthDef("dust_1", { + arg busOut = 1; + Out.ar(busOut,Dust.ar(1)); + }).send(s); + +SynthDef("dust_5", { + arg busOut = 1; + Out.ar(busOut,Dust.ar(5)); + }).send(s); + +SynthDef("dust_10", { + arg busOut = 1; + Out.ar(busOut,Dust.ar(10)); + }).send(s); + +SynthDef("feedback", { + arg busIn, busOut; + Out.ar(busOut, InFeedback.ar(busIn)); + }).send(s); + +SynthDef("edge", { + arg buffer, busIn, busOut, maxDelayTime = 1, delayTime = 0.5, mod = 4; + var offset, in, out; + in = In.ar(busIn); + out = BufDelayN.ar(buffer, in % mod, delayTime, 1, 0); + Out.ar(busOut, out); + }).send(s); + +SynthDef("input", { + arg busIn, busOut, mod = 4; + var offset, in, out; + in = In.ar(busIn); + out = ((in / 2.0 + 0.5) * mod).floor % mod; + Out.ar(busOut, out); + }).send(s); + +SynthDef("output", { + arg busIn, busOut, mod = 2; + var offset, in, out; + offset = 10; + in = In.ar(busIn); + out = ((in % mod) / (mod-1.0) - 0.5) * 2; + Out.ar(busOut, out); + }).send(s); + +n = NetAddr("127.0.0.1", 57151); +n.sendMsg("/addSynthDefs", + "sine_20", + "sine_30", + "sine_40", + "sine_50", + "sine_60", + "click", + "dust_1", + "dust_5", + "dust_10", +); +)