diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..0f005c7 Binary files /dev/null and b/.DS_Store differ diff --git a/README.textile b/README.textile index e69de29..f8fb1e0 100644 --- a/README.textile +++ b/README.textile @@ -0,0 +1,41 @@ +h1. "Live Beatbox":http://github.com/rfwatson/live-beatbox + +!http://rfwatson.github.com/images/beatbox.png! + + +Experimental drum machine which uses vocalization to select synthetic drum hits which best match beat-boxed sound. + +Currently uses a combination of MFCC, SpectralCentroid and ZeroCrossing measurements to analyze and match the timbre of the sounds. + +In super-alpha-beta state! It may or may not work on your setup. + +h2. Requirements + +* "SuperCollider":http://supercollider.sourceforge.net + +* Some sort of external microphone and audio interface. I use an Edirol FA101 when building this. I haven't got it working well with the Mac's internal sound + +* OSX - unless you want to make the GUI stuff cross-platform. + +h2. Keyboard shortcuts + +| @F1@ | Record mode | +| @F2@ | Preview recorded sound | +| @F3@ | Jamming mode | +| @Space@ | Start/stop sequencer | +| @Return@ | Add hit to seq (while playing) | +| @Backsp.@ | Remove hit (while playing) | +| @Up/Down@ | Select channel | +| @Left/Rt@ | Crossfader control | + +h2. TODO + +* Add analysis of amplitude envelope, only uses timbral analysis at the moment which while quite good it needs amp.env. comparison to be really intuitive +* Add ability to scan and add samples via GUI, from any location +* Improve doc +* Lots more... + +h2. Contact me + +Via "Github":http://github.com/rfwatson + diff --git a/classes/.DS_Store b/classes/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/classes/.DS_Store differ diff --git a/classes/RFWGens.sc b/classes/RFWGens.sc new file mode 100644 index 0000000..348ce83 --- /dev/null +++ b/classes/RFWGens.sc @@ -0,0 +1,11 @@ +AverageOutput : UGen { + *ar { + arg in, trig=0.0, mul=1.0, add=0.0; + ^this.multiNew('audio', in, trig).madd(mul, add); + } + + *kr { + arg in, trig=0.0, mul=1.0, add=0.0; + ^this.multiNew('control', in, trig).madd(mul, add); + } +} diff --git a/classes/beat.sc b/classes/beat.sc new file mode 100644 index 0000000..b4869b7 --- /dev/null +++ b/classes/beat.sc @@ -0,0 +1,101 @@ +Beat { + classvar maxFrames) { + Error("Sound file too large.").throw; + } { + rawsignal = Signal.newClear(sndfile.numFrames * sndfile.numChannels); + sndfile.readData(rawsignal); + + if(sndfile.numChannels == 1) { + signal = rawsignal; + } { + signal = rawsignal.clump(sndfile.numChannels).flop[0]; // channel 0 + }; + + sigbuf = Buffer.loadCollection(server, signal, 1, action: { + donefunc.(this) + }); + }; + } + + play { |xfade=0.0, mul=1.0| + var synth; + + // why isnt doneAction working for me? + synth = Synth(\beatboxplayer, [\bufnum1, sigbuf, \bufnum2, sampbuf, \crossfade, xfade, \mul, mul]); + SystemClock.sched(3.0, { synth.free }); + } + + analyse { |donefunc| + var duration, synth; + + duration = sigbuf.numFrames / server.sampleRate; + + bus = Bus.control(server, 22); // 20 MFCCs, 1 Spectral Centroid, 1 ZCR + fftbuf = Buffer.alloc(server, 1024, 1); + + server.makeBundle(1.0) { + synth = Synth(\beatboxanalyzer, [\bufnum, sigbuf, \fftbuf, fftbuf, \cbus1, bus.index, \cbus2, bus.index + 20, \cbus3, bus.index + 21]); + }; + + server.makeBundle(1.0 + duration, { + bus.getn(22) { |theFeatures| + features = theFeatures; + donefunc.(this); + }; + }); + + // 2 seconds later, free the synth, fft-buffer and the control bus. + SystemClock.sched(3.0 + duration) { + synth.free; + fftbuf.free; + bus.free; + }; + } + + nearest_{ |path| + var sndfile, rawsignal, len; + + nearestPath = path; + sndfile = SoundFile.openRead(path); + rawsignal = Signal.newClear(sndfile.numFrames * sndfile.numChannels); + sndfile.readData(rawsignal); + sample = rawsignal.clump(2).flop[0]; + + sampbuf = Buffer.readChannel(server, path, channels: [0], action: { |buf| + sampbuf = buf; + }); + } +} diff --git a/classes/box.sc b/classes/box.sc new file mode 100644 index 0000000..84fa916 --- /dev/null +++ b/classes/box.sc @@ -0,0 +1,379 @@ +BeatBox { + var <>basepath; + + var w, 0.0) { + seq.xfadeslid.value_(seq.xfadeval - 0.1).doAction; + } + }, + 124, { + // move to seq + if(seq.xfadeval < 1.0) { + seq.xfadeslid.value_(seq.xfadeval + 0.1).doAction; + } + }, + 126, { // move to seq + seq.currentChannel = (seq.currentChannel - 1) % seq.numChannels; + seq.selects[seq.currentChannel].value_(1).doAction; + }, + 125, { // move to seq + seq.currentChannel = (seq.currentChannel + 1) % seq.numChannels; + seq.selects[seq.currentChannel].value_(1).doAction; + } + ) + }; + + layout = FlowLayout(w.view.bounds); + w.view.decorator = layout; + + nchannels = 8; + + server = Server.local; + server.doWhenBooted { + recbuf = Buffer.alloc(server, server.sampleRate); + fftbuf = Buffer.alloc(server, 512); + }; + + isListening = false; + isRecording = false; + isJamming = false; + beats = Array.newClear(nchannels); + + File.use(basepath ++ "data.sc", "r") { |file| + data = file.readAllString.interpret; + }; + + this.initDisplay; + } + + initDisplay { + recbutton = SCButton(w, Rect(5, 5, 100, 25)) + .states_([ + [ "Record (F1)", Color.black, Color.green ], + [ "Stop (F1)", Color.white, Color.red ], + ]) + .action_{ |button| this.switch(button) } + .keyDownAction_{ nil }; + + SCButton(w, Rect(5, 5, 100, 25)) + .states_([ + [ "Preview (F2)", Color.black, Color.green ], + ]) + .action_{ |button| this.preview(button) } + .keyDownAction_{ nil }; + + jambutton = SCButton(w, Rect(5, 5, 100, 25)) + .states_([ + [ "Jam (F3)", Color.black, Color.green ], + [ "Stop (F1)", Color.white, Color.red ], + ]) + .action_{ |button| this.jam(button.value) } + .keyDownAction_{ nil }; + + + layout.nextLine; + layout.nextLine; + + SCStaticText(w, Rect(5, 5, 200, 25)) + .string_("Threshold") + .font_(Font("Helvetica-Bold", 12)); + + + SCStaticText(w, Rect(200, 5, 30, 25)) + .string_("Lag") + .font_(Font("Helvetica-Bold", 12)); + + layout.nextLine; + + SCSlider(w, Rect(5, 5, 100, 25)) + .step_(0.1) + .value_(0.3) + .action_{ |slider| + var value = slider.value.clip(0.1, 1.0); + synth.set(\threshold, value); + thresholdText.string_(value.asString); + } + .keyDownAction_{ nil }; + + thresholdText = SCStaticText(w, Rect(5, 5, 95, 25)) + .string_("0.3"); + + SCSlider(w, Rect(200, 5, 100, 25)) + .step_(0.05) + .value_(0.1) + .action_{ |slider| + var value = slider.value.clip(0.1, 1.0); + synth.set(\lag, value); + lagText.string_(value.asString); + } + .keyDownAction_{ nil }; + + lagText = SCStaticText(w, Rect(5, 5, 20, 25)) + .string_("0.1"); + + layout.nextLine; + + statusText = SCStaticText(w, Rect(5, 5, 510, 25)) + .background_(Color.grey); + + layout.nextLine; + + scope = SCUserView(w, Rect(5, 5, 510, 150)) + .relativeOrigin_(true) + .background_(Color.black) + .drawFunc_({ this.drawWaveform }); + + layout.nextLine; + + lowerStatus = SCStaticText(w, Rect(5, 5, 510, 25)) + .background_(Color.grey); + + layout.nextLine; + + seq = Sequencer(w, Rect(5, 5, 510, 300), server, beats, this); + + w.onClose = { scope.free }; + w.front; + } + + switch { |button| + if(button.value == 1) { + jambutton.enabled = false; + this.listen; + } { + this.silenceDetected; + this.ignore; + jambutton.enabled = true; + } + } + + jam { |value| // 0 is on, 1 is off: relates to SCButton value + if(value == 1) { + recbutton.enabled = false; + isJamming = true; + if(seq.playing.not) { + seq.play + }; + this.listen(amp: 0.0); + } { + isJamming = false; + recbutton.enabled = true; + jambutton.value = 0; + this.ignore; + } + } + + preview { + seq.previewCurrentChannel; + } + + onsetDetected { + Post << "Onset!" << $\n; + if(isJamming) { + { + seq.setCurrentHit; + }.defer; + } { + if(isRecording.not) { + isRecording = true; + synth.set(\t_resetRecord, 1); + recStart = SystemClock.seconds; + { statusText.background_(Color.red).stringColor_(Color.white).background_(Color.red).string_("RECORDING") }.defer; + } + } + } + + silenceDetected { + var dursamps, sndfile, signal, beat; + Post << "Silence!" << $\n; + + if(isRecording) { + synth.run(false); + { + statusText.background_(Color.green).stringColor_(Color.black).string_("Analysing..."); + }.defer; + dursamps = ((SystemClock.seconds - recStart) * server.sampleRate).asInteger; + recbuf.loadToFloatArray(0, dursamps) { |floatdata| + // check received from server OK - sometimes fails + if(floatdata.isEmpty.not) { + signal = Signal.newFrom(floatdata); + signal.normalize; + + beats[seq.currentChannel] = Beat.newFromSignal(signal, server); + beats[seq.currentChannel].analyse { |beat| + this.findNearest(beat); + { + // allow new recording to begin only after completely finsihed + scope.refresh; + isRecording = false; + statusText.background_(Color.grey).stringColor_(Color.black).string_(""); + this.updateLowerStatus; + recbutton.value_(0).doAction; + }.defer; + } + } + } + } + } + + listen { |amp=1.0| + var msg, action; + + if(isListening.not) { // start listening to input + synth = Synth(\beatboxlistener, [\out, 0, \in, 0, \fftbuf, fftbuf, \recbuf, recbuf, \amp, amp]); + + onsetListener = OSCresponderNode(nil, '/tr') { |time, responder, msg| + action = msg[3]; + action.asInteger.switch( + 1, { this.onsetDetected }, + 2, { this.silenceDetected } + ); + }.add; + + statusText.background_(Color.grey).stringColor_(Color.black).string_("Waiting for input..."); + isListening = true; + } + } + + ignore { + if(isListening) { + var wasRecording = isRecording; + this.silenceDetected; + synth.free; + onsetListener.remove; + + if(wasRecording) { + statusText.background_(Color.green).stringColor_(Color.black).string_("Analysing..."); + } { + statusText.background_(Color.grey).stringColor_(Color.black).string_(""); + }; + + isListening = false; + } + } + + // TODO move to Beat.sc + findNearest { |beat| + var p, total; + var nearest = 10e10; + var neighbour; + + data.getPairs.clump(2).do { |pair| + var fname, features; + # fname, features = pair; + total = 0.0; + features.size.do { |i| + p = (beat.features[i] - features[i]).squared; + total = total + p; + }; + + if(total < nearest) { + neighbour = fname; + nearest = total; + }; + }; + + if(neighbour.isNil) { // FIX sometimes a strange bug causes a lot of nan's to be produced + "There was an error analysing this sound. Try another".postln; + } { + beat.nearest = neighbour; + } + } + + refresh { + scope.refresh + } + + updateLowerStatus { + var beat = seq.beats[seq.currentChannel]; + beat !? { + beat.nearestPath !? { + lowerStatus.string_(beat.nearestPath.basename); + ^this; + } + }; + + lowerStatus.string_(""); + } + + drawWaveform { + // why is SCSoundFileView so frustrating? + var sig, maximums, x2, y1, y2, p1, p2; + var beat = beats[seq.currentChannel]; + + beat !? { + p1 = 0 @ 75; + + if(beat.sample.notNil) { + sig = (beat.sample * (seq.xfadeval)) +.s (beat.signal * (1 - seq.xfadeval)); + } { + sig = beat.signal; + }; + + maximums = sig.clump(sig.size / 510).collect{ |window| + var posmax, negmax; + posmax = window.maxItem; + negmax = window.minItem; + + if(posmax.abs > negmax.abs) + { posmax } { negmax } + }; + + Pen.use { + Color(0.3, 1, 0.3).set; + maximums.do { |max, x1| + p2 = x1 @ (75 - (75 * max)); + Pen.moveTo(p1); + Pen.lineTo(p2); + Pen.stroke; + + p1 = p2; + } + } + } + } +} diff --git a/classes/sequencer.sc b/classes/sequencer.sc new file mode 100644 index 0000000..ea9a0e1 --- /dev/null +++ b/classes/sequencer.sc @@ -0,0 +1,237 @@ +Sequencer { + var w, view, channels, buttons, currentChannel, 0) { + buttonvals[channel][hit].switch( + 1, { mul = 0.3 }, + 2, { mul = 0.7 }, + 3, { mul = 1.0 } + ); + beats[channel].play(xfadeval, mul) + } + } + }; + + n = n + 1; + (((60 / tempoBox.value)) / 4).wait + } + } + } + + initDisplay { |bounds| + var cbar, tbar; + + view = SCVLayoutView(w, bounds); + view.background_(Color.grey); + + cbar = SCHLayoutView(view, Rect(5, 5, 510, 25)); + + mainbutton = SCButton(cbar, 100 @ 20) + .states_([ + [ "Play", Color.black, Color.green ], + [ "Stop", Color.white, Color.red ] + ]) + .action_{ |button| + button.value.switch( + 0, { this.stop }, + 1, { this.play } + ) + } + .keyDownAction_{ nil }; + + SCStaticText(cbar, 30 @ 20) + .string_(""); + + SCStaticText(cbar, 30 @ 20) + .string_("BPM"); + + SCSlider(cbar, 60 @ 20) + .action_{ |slid| + var spec = [80, 180, \linear, 1].asSpec; + tempoBox.value = spec.map(slid.value); + } + .keyDownAction_{ nil } + .value_(0.5); + + tempoBox = SCNumberBox(cbar, Rect(5, 5, 60, 20)) + .value_(130); + + SCStaticText(cbar, 30 @ 20) + .string_(""); + + SCStaticText(cbar, 42 @ 20) + .string_("XFader"); + + xfadeslid = SCSlider(cbar, 60 @ 20) + .action_{ |slider| + xfadeval = slider.value; + beatbox.refresh; + } + .keyDownAction_{ nil }; + + tbar = SCHLayoutView(view, Rect(5, 5, 510, 20)); + + SCStaticText(tbar, Rect(5, 5, 60, 20)); + + 16.do { |n| + indicators[n] = SCButton(tbar, Rect(5, 5, 20, 20)) + .states_([ + [ "", Color.grey, Color.grey ], + [ "", Color.black, Color.green ] + ]) + .enabled_(false) + }; + + channels.size.do { |channel| + var button; + var hbox = SCHLayoutView(view, Rect(5, 5, 380, 20)); + hbox.background_(Color(0.4, 0.4, 0.4)); + + button = SCButton(hbox, Rect(5, 5, 60, 20)) + .states_([ + [ "Select", Color.black, Color.grey ], + [ "Select", Color.black, Color.yellow ] + ]) + .action_{ |thisButton| + view.children[2..channels.size+1].do { |hbox, n| + var anotherButton = hbox.children.first; + if(thisButton == anotherButton) { + currentChannel = n; + thisButton.value = 1; + beatbox.scope.refresh; + beatbox.updateLowerStatus; + } { + anotherButton.value = 0; + } + } + } + .keyDownAction_{ nil }; + + if(channel == 0) + { button.value = 1 } { button.value = 0 }; + + selects.add(button); + + 16.do { |n| + var button; + button = SCButton(hbox, Rect(5, 5, 20, 20)) + .states_([ + [ "", Color.white, Color.grey ], + [ "x", Color.black, Color.yellow ], + [ "x", Color.black, Color(1.0, 0.55, 0.0) ], + [ "X", Color.white, Color.red ] + ]) + .action_{ |button| + buttonvals[channel][n] = button.value; + } + .keyDownAction_{ nil }; + + buttons[channel].add(button); + buttonvals[channel].add(0); + } + } + } + + play { + if(playing.not) { + startedTime = SystemClock.seconds; + routine.play; + playing = true; + mainbutton.value = 1; + } + } + + stop { + if(playing) { + routine.stop; + this.initRoutine; + beatbox.jam(0); + indicators.do { |light| { light.value = 0 }.defer(0.2) }; + playing = false; + mainbutton.value = 0; + } + } + + setCurrentHit { + var currentHit = this.currentHit; + beats[currentChannel].play; + buttonvals[currentChannel][currentHit] = 2; + buttons[currentChannel][currentHit].value = 2; + } + + clearCurrentHit { + var currentHit = this.currentHit; + buttonvals[currentChannel][currentHit] = 0; + buttons[currentChannel][currentHit].value = 0; + } + + currentHit { + var durplaying, bardur, sdur, thisbar, currhit; + + if(playing) { + durplaying = SystemClock.seconds - startedTime; + bardur = (60 / tempoBox.value) * 4; + sdur = bardur / 16; + thisbar = durplaying % bardur; + currhit = ((thisbar / sdur).asInteger - 1) % 16; + + ^currhit + } { + ^0 + } + } + + allButtons { + ^view.children[1..9].collect{ |hview| + hview.children[1..16] + }; + } + + numChannels { + ^channels.size; + } + + previewCurrentChannel { + beats[currentChannel].play(xfadeval, 0.7) + } +} diff --git a/data.sc b/data.sc new file mode 100644 index 0000000..426cf62 --- /dev/null +++ b/data.sc @@ -0,0 +1,11 @@ +( "/Developer/Projects/live-beatbox/samples/Closed hat 6.wav": [ 0.028100816532969, 0.20734845101833, 0.44244965910912, 0.19834707677364, 0.29480570554733, 0.21033130586147, 0.19226108491421, 0.16130591928959, 0.20348688960075, 0.16594757139683, 0.20781420171261, 0.20277032256126, 0.24474443495274, 0.21634757518768, 0.25939178466797, 0.24534736573696, 0.28614860773087, 0.24162520468235, 0.26033365726471, 0.24491479992867, 0.96856129169464, 0.81802827119827 ], "/Developer/Projects/live-beatbox/samples/Clap 3.wav": [ 0.68969398736954, -0.1031379699707, -0.010573903098702, 0.0011192427482456, 0.10929827392101, 0.17618775367737, 0.2313070744276, 0.25493428111076, 0.24094235897064, 0.23673513531685, 0.22424203157425, 0.21854357421398, 0.21852107346058, 0.23635332286358, 0.23915708065033, 0.24596996605396, 0.25377571582794, 0.25055998563766, 0.25317540764809, 0.24054843187332, 0.45369762182236, 0.28721743822098 ], "/Developer/Projects/live-beatbox/samples/Open hat 6.wav": [ -0.10418137907982, 0.12545272707939, 0.26413142681122, 0.11792324483395, 0.13093458116055, 0.15442660450935, 0.2201838940382, 0.21260103583336, 0.27931788563728, 0.21682423353195, 0.30024662613869, 0.32407745718956, 0.32413098216057, 0.27243322134018, 0.34235110878944, 0.32974123954773, 0.31098112463951, 0.27653843164444, 0.24456091225147, 0.2412886172533, 1.1818572282791, 0.8577134013176 ], "/Developer/Projects/live-beatbox/samples/Open hat 4.wav": [ -0.44512757658958, -0.28453382849693, 0.019333604723215, -0.1732130497694, 0.029163746163249, 0.01279385201633, 0.095025569200516, 0.067504234611988, 0.16189058125019, 0.19917987287045, 0.24972932040691, 0.22220753133297, 0.26714646816254, 0.2609791457653, 0.25403741002083, 0.27353420853615, 0.29010003805161, 0.22680869698524, 0.19121085107327, 0.24994830787182, 1.1471894979477, 0.90326148271561 ], + "/Developer/Projects/live-beatbox/samples/Snare 8.wav": [ 0.48005995154381, 0.058043457567692, 0.45187604427338, 0.2283534258604, 0.40486064553261, 0.26525577902794, 0.32236662507057, 0.24231749773026, 0.29479596018791, 0.24303676187992, 0.25518527626991, 0.19307468831539, 0.23229494690895, 0.19739992916584, 0.23464648425579, 0.20485074818134, 0.21900154650211, 0.21084386110306, 0.22259071469307, 0.21663491427898, 0.59355241060257, 0.50185519456863 ], "/Developer/Projects/live-beatbox/samples/Closed hat 1.wav": [ 0.062044788151979, 0.1052081361413, 0.4205387532711, 0.20742812752724, 0.35730031132698, 0.2454069852829, 0.27549934387207, 0.25356411933899, 0.33766117691994, 0.21182133257389, 0.3126594722271, 0.2204102575779, 0.23577497899532, 0.28142130374908, 0.27484825253487, 0.20640909671783, 0.33941233158112, 0.18872247636318, 0.28233349323273, 0.28189796209335, 0.93620014190674, 0.77957373857498 ], "/Developer/Projects/live-beatbox/samples/Kick d.wav": [ 1.4694187641144, 0.67598873376846, 0.55756497383118, 0.41486153006554, 0.41115987300873, 0.33388984203339, 0.32402813434601, 0.27600729465485, 0.30255457758904, 0.27113127708435, 0.27435728907585, 0.24311591684818, 0.25029489398003, 0.24023097753525, 0.2524850666523, 0.24844248592854, 0.24629904329777, 0.25076055526733, 0.24851040542126, 0.23607671260834, 0.048439539968967, 0.0095306942239404 ], "/Developer/Projects/live-beatbox/samples/Open hat 5.wav": [ -0.2410766929388, -0.035868398845196, 0.28107652068138, 0.067077621817589, 0.20943081378937, 0.19142307341099, 0.2358707934618, 0.17827734351158, 0.1976870149374, 0.23997999727726, 0.29167410731316, 0.27388048171997, 0.26068586111069, 0.28834983706474, 0.26689144968987, 0.25419098138809, 0.26368796825409, 0.30371418595314, 0.26542043685913, 0.19742566347122, 1.1515715122223, 0.89676320552826 ], "/Developer/Projects/live-beatbox/samples/snare 2.wav": [ 0.23288822174072, 0.16889598965645, 0.26748639345169, 0.28498288989067, 0.24526613950729, 0.25464102625847, 0.25208041071892, 0.25892278552055, 0.20539751648903, 0.2151442617178, 0.22292718291283, 0.19789381325245, 0.20437158644199, 0.19868516921997, 0.21727727353573, 0.20834235846996, 0.23634694516659, 0.24443908035755, 0.25261974334717, 0.24812336266041, 1.0816323757172, 0.77368497848511 ], + "/Developer/Projects/live-beatbox/samples/Snare 7.wav": [ 0.09044323861599, 0.16288183629513, 0.40270894765854, 0.19544792175293, 0.39212024211884, 0.25524243712425, 0.25996765494347, 0.18911173939705, 0.1760091483593, 0.18137215077877, 0.20859894156456, 0.19736552238464, 0.20673575997353, 0.21071603894234, 0.21623130142689, 0.21338751912117, 0.21975739300251, 0.22306030988693, 0.22703586518764, 0.23083430528641, 0.92165344953537, 0.83659398555756 ], "/Developer/Projects/live-beatbox/samples/RIDE 3.wav": [ -0.071648597717285, 0.0553621314466, 0.36981308460236, 0.15631999075413, 0.24372327327728, 0.23463135957718, 0.24096707999706, 0.3165086209774, 0.24067643284798, 0.22424438595772, 0.24786140024662, 0.30708941817284, 0.27702814340591, 0.27915367484093, 0.31422239542007, 0.28455889225006, 0.21855114400387, 0.22710810601711, 0.29566925764084, 0.31767588853836, 1.2412390708923, 0.8346706032753 ], "/Developer/Projects/live-beatbox/samples/Kick b.wav": [ 1.0275176763535, 0.42086938023567, 0.47628819942474, 0.35202345252037, 0.38319835066795, 0.32463994622231, 0.32781052589417, 0.29058158397675, 0.31597372889519, 0.28384652733803, 0.26735052466393, 0.24412631988525, 0.27344533801079, 0.24078017473221, 0.25736999511719, 0.24493227899075, 0.24702084064484, 0.25655102729797, 0.24532003700733, 0.24291236698627, 0.5, 0.018167873844504 ], "/Developer/Projects/live-beatbox/samples/Kick f.wav": [ 1.1850464344025, 0.56375002861023, 0.62069565057755, 0.41818651556969, 0.4848268032074, 0.3511588871479, 0.35587561130524, 0.30143275856972, 0.33469501137733, 0.25428041815758, 0.27268934249878, 0.25191819667816, 0.27329647541046, 0.25330182909966, 0.26204028725624, 0.25307887792587, 0.26889654994011, 0.25623142719269, 0.2646167576313, 0.22322624921799, 0.080272883176804, 0.062225174158812 ], "/Developer/Projects/live-beatbox/samples/Jive 1.wav": [ 2.008181810379, 0.1114629805088, -0.19041830301285, 0.17800055444241, 0.10522022843361, 0.10384325683117, 0.091366000473499, 0.18637864291668, 0.15609197318554, 0.218904286623, 0.15681007504463, 0.23575966060162, 0.21251802146435, 0.24058331549168, 0.23506790399551, 0.27995800971985, 0.23713010549545, 0.27074864506721, 0.25944158434868, 0.2561457157135, 0.2696832716465, 0.15137416124344 ], + "/Developer/Projects/live-beatbox/samples/Dang.wav": [ 1.3726348876953, -0.12131077051163, 0.33612629771233, -0.0073578511364758, 0.4443356692791, 0.060378164052963, 0.16375541687012, 0.17800076305866, 0.26725167036057, 0.16094505786896, 0.30799224972725, 0.21561317145824, 0.24000510573387, 0.12743046879768, 0.23220203816891, 0.24272820353508, 0.30206876993179, 0.25479578971863, 0.30772313475609, 0.21098980307579, 0.21562270820141, 0.19006127119064 ], "/Developer/Projects/live-beatbox/samples/Kick h.wav": [ 0.94912803173065, 0.47477921843529, 0.47514694929123, 0.39133659005165, 0.37936681509018, 0.33316299319267, 0.34080484509468, 0.31337457895279, 0.30304673314095, 0.28494390845299, 0.29126861691475, 0.28071278333664, 0.26825761795044, 0.25835114717484, 0.26706477999687, 0.26147267222404, 0.25467404723167, 0.25114393234253, 0.25055089592934, 0.24970503151417, 0.5, 0.0071526719257236 ], "/Developer/Projects/live-beatbox/samples/Clap 7.wav": [ 0.45760855078697, -0.53774011135101, 0.11809688061476, -0.022978089749813, 0.28350520133972, 0.25455424189568, 0.32863521575928, 0.24806566536427, 0.2637283205986, 0.22635988891125, 0.22288265824318, 0.22947107255459, 0.21795237064362, 0.22538688778877, 0.21112777292728, 0.24360074102879, 0.2526421546936, 0.2450682669878, 0.23174214363098, 0.23427757620811, 0.5, 0.38377928733826 ], "/Developer/Projects/live-beatbox/samples/Kick g.wav": [ 0.77546149492264, 0.25903755426407, 0.43933844566345, 0.31100153923035, 0.36109203100204, 0.31638413667679, 0.30694463849068, 0.28719618916512, 0.2780165374279, 0.28012502193451, 0.26964429020882, 0.27232471108437, 0.25955757498741, 0.25745919346809, 0.26201918721199, 0.25883275270462, 0.26024949550629, 0.25421079993248, 0.2531750202179, 0.25156399607658, 0.5, 0.014633702114224 ], "/Developer/Projects/live-beatbox/samples/Reverse Kickverb 1.wav": [ 0.65726900100708, 0.2196581363678, 0.46005126833916, 0.33910647034645, 0.39426189661026, 0.3887896835804, 0.48469299077988, 0.30275547504425, 0.3670559823513, 0.31545257568359, 0.33550706505775, 0.21714062988758, 0.23645380139351, 0.22909854352474, 0.25922292470932, 0.26951062679291, 0.22685568034649, 0.25833064317703, 0.23572447896004, 0.25781145691872, 0.41389018297195, 0.41833674907684 ], + "/Developer/Projects/live-beatbox/samples/Closed hat 7.wav": [ -0.24332734942436, -0.19322003424168, 0.11073984950781, -0.036541625857353, 0.16119985282421, 0.078292816877365, 0.17915719747543, 0.088216088712215, 0.16625311970711, 0.13215026259422, 0.18953235447407, 0.14608120918274, 0.17454707622528, 0.19149056077003, 0.18912726640701, 0.20503352582455, 0.21757933497429, 0.22102501988411, 0.18678431212902, 0.1575553715229, 0.82220542430878, 0.83023869991302 ], "/Developer/Projects/live-beatbox/samples/snare 3.wav": [ 0.010340093635023, 0.26783630251884, 0.46705850958824, 0.077159933745861, 0.29836475849152, 0.19020067155361, 0.2185792028904, 0.18547111749649, 0.18239812552929, 0.14637440443039, 0.14732220768929, 0.16217519342899, 0.17602598667145, 0.16259501874447, 0.17616434395313, 0.18828554451466, 0.18788261711597, 0.19264253973961, 0.19720312952995, 0.19981990754604, 1.0201820135117, 0.91014039516449 ], "/Developer/Projects/live-beatbox/samples/Open hat 2.wav": [ -0.034306570887566, -0.025015247985721, 0.043670170009136, 0.18788066506386, 0.25913843512535, 0.25933668017387, 0.34453058242798, 0.24959759414196, 0.28827533125877, 0.29399245977402, 0.33879417181015, 0.3397359251976, 0.27718633413315, 0.24628461897373, 0.24696044623852, 0.25910675525665, 0.23674920201302, 0.28290963172913, 0.26674449443817, 0.29088559746742, 1.0992873907089, 0.75664979219437 ], "/Developer/Projects/live-beatbox/samples/Open hat 7.wav": [ -0.065972350537777, -0.047986380755901, 0.25927954912186, 0.24974997341633, 0.33265352249146, 0.31632879376411, 0.31878867745399, 0.24471218883991, 0.26005679368973, 0.26852366328239, 0.34280428290367, 0.27297979593277, 0.28097099065781, 0.26964583992958, 0.26762807369232, 0.24684555828571, 0.30079361796379, 0.3047471344471, 0.22172579169273, 0.1891892105341, 0.97126388549805, 0.71091687679291 ], "/Developer/Projects/live-beatbox/samples/Kick 10.wav": [ 1.0290342569351, 0.52106761932373, 0.4798122048378, 0.40940818190575, 0.34327286481857, 0.34119325876236, 0.30624306201935, 0.30112782120705, 0.29277807474136, 0.28743726015091, 0.26574268937111, 0.26841932535172, 0.25287494063377, 0.25602960586548, 0.25086104869843, 0.26419657468796, 0.24690487980843, 0.258620262146, 0.24924497306347, 0.24921731650829, 0.5, 0.021645735949278 ], + "/Developer/Projects/live-beatbox/samples/Kick 9.wav": [ 0.91486287117004, 0.50329053401947, 0.53434139490128, 0.43013602495193, 0.39190992712975, 0.35855367779732, 0.3406754732132, 0.3098658323288, 0.31276261806488, 0.25969594717026, 0.26555797457695, 0.27105391025543, 0.26375368237495, 0.25955957174301, 0.24891266226768, 0.25785031914711, 0.23536555469036, 0.26002407073975, 0.23747043311596, 0.25289025902748, 0.5, 0.028275629505515 ], "/Developer/Projects/live-beatbox/samples/Cybertraffic.wav": [ 0.85925531387329, 0.17685735225677, 0.56030106544495, 0.29923614859581, 0.37516349554062, 0.25706788897514, 0.35793110728264, 0.26919054985046, 0.29908254742622, 0.26757419109344, 0.30571037530899, 0.23897756636143, 0.26983228325844, 0.25159353017807, 0.28809693455696, 0.25563251972198, 0.30014634132385, 0.25844004750252, 0.22838726639748, 0.21548092365265, 0.35042345523834, 0.34315386414528 ], "/Developer/Projects/live-beatbox/samples/Woosh.wav": [ 1.007453918457, 0.42520293593407, 0.55425077676773, 0.0073907384648919, 0.47816756367683, 0.20854979753494, 0.26529437303543, 0.27382108569145, 0.25220638513565, 0.14099989831448, 0.32786285877228, 0.15587821602821, 0.29569259285927, 0.17399077117443, 0.31752371788025, 0.16004726290703, 0.30391189455986, 0.18779745697975, 0.28517481684685, 0.19686424732208, 0.35602983832359, 0.45979124307632 ], "/Developer/Projects/live-beatbox/samples/Open hat 3.wav": [ -0.18806827068329, -0.00079264352098107, 0.31595858931541, 0.092756599187851, 0.25084030628204, 0.21592333912849, 0.26540276408195, 0.19380535185337, 0.25293180346489, 0.27491039037704, 0.32317113876343, 0.27470606565475, 0.28405353426933, 0.29907646775246, 0.27724125981331, 0.2689326107502, 0.30329623818398, 0.3080695271492, 0.22824014723301, 0.20424315333366, 1.1381356716156, 0.88983279466629 ], "/Developer/Projects/live-beatbox/samples/Closed hat 3.wav": [ -0.28816375136375, -0.13784410059452, 0.31698474287987, 0.25378674268723, 0.29153180122375, 0.21960514783859, 0.33303824067116, 0.29769653081894, 0.26781690120697, 0.23649933934212, 0.29384699463844, 0.26055938005447, 0.25487524271011, 0.24171581864357, 0.2319603562355, 0.23127561807632, 0.25001472234726, 0.25035083293915, 0.24250701069832, 0.23738117516041, 0.94486618041992, 0.73061567544937 ], + "/Developer/Projects/live-beatbox/samples/Kick 1.wav": [ 0.91588175296783, 0.45428588986397, 0.58496528863907, 0.37314572930336, 0.43883562088013, 0.34101384878159, 0.35809069871902, 0.31187471747398, 0.29064503312111, 0.27320289611816, 0.27221542596817, 0.26456612348557, 0.27674540877342, 0.26659473776817, 0.26472440361977, 0.26809406280518, 0.2760956287384, 0.24874351918697, 0.25621056556702, 0.23885579407215, 0.5, 0.017491262406111 ], "/Developer/Projects/live-beatbox/samples/Jive 3.wav": [ 2.2372143268585, -0.024090813472867, -0.31805682182312, 0.16341361403465, 0.082020059227943, 0.023007264360785, 0.18150432407856, 0.24999004602432, 0.1153752207756, 0.1944026350975, 0.23748798668385, 0.21152111887932, 0.17090894281864, 0.26320824027061, 0.23613372445107, 0.24748049676418, 0.2459375411272, 0.27975836396217, 0.24011984467506, 0.25249254703522, 0.27104198932648, 0.14754858613014 ], "/Developer/Projects/live-beatbox/samples/Kick a.wav": [ 1.1005251407623, 0.29586187005043, 0.57041263580322, 0.50809097290039, 0.40964633226395, 0.40783306956291, 0.35798427462578, 0.34668016433716, 0.30565163493156, 0.30940017104149, 0.2526627779007, 0.26721423864365, 0.23252418637276, 0.24234329164028, 0.23594723641872, 0.23505254089832, 0.24642345309258, 0.23845611512661, 0.24567161500454, 0.25639548897743, 0.10753717273474, 0.052953895181417 ], "/Developer/Projects/live-beatbox/samples/Kick 4.wav": [ 0.93611294031143, 0.25800436735153, 0.5811305642128, 0.34725385904312, 0.49174624681473, 0.36284822225571, 0.33105072379112, 0.31319147348404, 0.28728953003883, 0.27400785684586, 0.27199250459671, 0.2534915804863, 0.24526245892048, 0.22176134586334, 0.24928249418736, 0.2540597319603, 0.24614335596561, 0.24308599531651, 0.24642080068588, 0.22563152015209, 0.209263920784, 0.23855546116829 ], "/Developer/Projects/live-beatbox/samples/Clap 8.wav": [ 0.60428720712662, 0.053041979670525, 0.36905217170715, 0.15040497481823, 0.28244566917419, 0.2944687306881, 0.23870798945427, 0.23898273706436, 0.19173449277878, 0.14166882634163, 0.15116521716118, 0.19989791512489, 0.19289819896221, 0.20128247141838, 0.21126517653465, 0.21161749958992, 0.21415655314922, 0.18606813251972, 0.19433003664017, 0.19657017290592, 0.57824128866196, 0.50658804178238 ], + "/Developer/Projects/live-beatbox/samples/Kick i.wav": [ 1.2660367488861, 0.72230404615402, 0.39479839801788, 0.45937439799309, 0.44627648591995, 0.48469826579094, 0.41922482848167, 0.38191515207291, 0.31499260663986, 0.2971103489399, 0.2607139647007, 0.26749032735825, 0.26705753803253, 0.26931434869766, 0.26219287514687, 0.2657016813755, 0.25427350401878, 0.24527046084404, 0.24137346446514, 0.24400290846825, 0.060839485377073, 0.012823117896914 ], "/Developer/Projects/live-beatbox/samples/Kick j.wav": [ 0.66568666696548, 0.3877287209034, 0.72663903236389, 0.33814695477486, 0.4586991071701, 0.32867577672005, 0.39185512065887, 0.30321332812309, 0.34862568974495, 0.28302523493767, 0.33535400032997, 0.27233931422234, 0.28381314873695, 0.25223881006241, 0.28536349534988, 0.26062855124474, 0.25366026163101, 0.22903640568256, 0.26199051737785, 0.26285922527313, 0.25105962157249, 0.25947561860085 ], "/Developer/Projects/live-beatbox/samples/snare 1.wav": [ 0.18251430988312, 0.23462139070034, 0.52651435136795, 0.26855412125587, 0.41172385215759, 0.23681636154652, 0.28830567002296, 0.2267539203167, 0.20542639493942, 0.19373570382595, 0.18983379006386, 0.1831424087286, 0.19364219903946, 0.1918915361166, 0.2182579934597, 0.2308054715395, 0.23444300889969, 0.2395131289959, 0.24769546091557, 0.25882142782211, 0.91999870538712, 0.74711364507675 ], "/Developer/Projects/live-beatbox/samples/Clap 1.wav": [ 0.72256773710251, 0.004198984708637, 0.0069205807521939, 0.057040087878704, 0.18090313673019, 0.28535178303719, 0.34019842743874, 0.33379846811295, 0.33037883043289, 0.30148312449455, 0.29975843429565, 0.28523281216621, 0.28533810377121, 0.28715687990189, 0.30975842475891, 0.3136482834816, 0.30015376210213, 0.3000565469265, 0.29190695285797, 0.28178691864014, 0.44229477643967, 0.22089773416519 ], "/Developer/Projects/live-beatbox/samples/Kick c.wav": [ 0.78290051221848, 0.42011481523514, 0.39649233222008, 0.36926603317261, 0.34262925386429, 0.32996726036072, 0.31573995947838, 0.30807968974113, 0.30669462680817, 0.28580591082573, 0.28369721770287, 0.27740976214409, 0.26322227716446, 0.26025024056435, 0.26295265555382, 0.25613257288933, 0.25432777404785, 0.24833436310291, 0.24755972623825, 0.24598668515682, 0.5, 0.0095669003203511 ], + "/Developer/Projects/live-beatbox/samples/Clap 2.wav": [ 0.49899563193321, -0.30962714552879, -0.16894295811653, -0.18331563472748, 0.080371178686619, 0.12191355973482, 0.20887231826782, 0.16864922642708, 0.17281931638718, 0.15626810491085, 0.2069805264473, 0.18230508267879, 0.19472655653954, 0.20361450314522, 0.22917656600475, 0.22764115035534, 0.24265982210636, 0.23105123639107, 0.24881926178932, 0.23226749897003, 0.42349317669868, 0.26700448989868 ], "/Developer/Projects/live-beatbox/samples/Kick e.wav": [ 1.2427742481232, 0.48412781953812, 0.46151006221771, 0.35224568843842, 0.48598083853722, 0.40589734911919, 0.36835569143295, 0.28702196478844, 0.3270283639431, 0.29504770040512, 0.28973612189293, 0.27286118268967, 0.24378871917725, 0.23382867872715, 0.23643144965172, 0.25075927376747, 0.24520194530487, 0.22855411469936, 0.25418031215668, 0.25720977783203, 0.094749562442303, 0.052820481359959 ], "/Developer/Projects/live-beatbox/samples/Closed hat 4.wav": [ -0.025490814819932, 0.21730072796345, 0.31080269813538, 0.073317714035511, 0.17443419992924, 0.17215865850449, 0.18599112331867, 0.1290600001812, 0.1416395008564, 0.17911048233509, 0.16852425038815, 0.16788147389889, 0.15692643821239, 0.18094246089458, 0.18207062780857, 0.18391583859921, 0.19118309020996, 0.18408054113388, 0.18447045981884, 0.18203270435333, 1.0191293954849, 0.93772488832474 ], "/Developer/Projects/live-beatbox/samples/Kick 2.wav": [ 0.8845841884613, 0.25268477201462, 0.5130113363266, 0.30332741141319, 0.4292431473732, 0.33092740178108, 0.39809715747833, 0.29576361179352, 0.28895643353462, 0.27257210016251, 0.26320305466652, 0.23345525562763, 0.24167196452618, 0.24578388035297, 0.23537655174732, 0.26244062185287, 0.23740193247795, 0.2460995465517, 0.24321322143078, 0.23303996026516, 0.28596416115761, 0.30931651592255 ], "/Developer/Projects/live-beatbox/samples/Boosh.wav": [ 0.82914632558823, 0.10062445700169, 0.72980725765228, 0.13170671463013, 0.37320697307587, 0.12884978950024, 0.34461215138435, 0.10162660479546, 0.30351492762566, 0.096267476677895, 0.25027343630791, 0.16578996181488, 0.26388508081436, 0.18736755847931, 0.26469105482101, 0.18993745744228, 0.29747033119202, 0.19093061983585, 0.29271197319031, 0.17798589169979, 0.43806856870651, 0.42755684256554 ], + "/Developer/Projects/live-beatbox/samples/Kick 7.wav": [ 1.2825565338135, 0.51177829504013, 0.50188928842545, 0.32276037335396, 0.35196831822395, 0.28597509860992, 0.30678096413612, 0.27806276082993, 0.27261769771576, 0.25930467247963, 0.25348848104477, 0.24722228944302, 0.23828437924385, 0.24415953457355, 0.25925692915916, 0.25468355417252, 0.24741281569004, 0.23701874911785, 0.24644240736961, 0.24456100165844, 0.5, 0.015705352649093 ], "/Developer/Projects/live-beatbox/samples/Kick 8.wav": [ 0.89023840427399, 0.39156287908554, 0.52313667535782, 0.40548461675644, 0.39242249727249, 0.30010604858398, 0.34176275134087, 0.30604696273804, 0.28998252749443, 0.284569054842, 0.27921843528748, 0.27235385775566, 0.27355247735977, 0.24842885136604, 0.26147907972336, 0.26604726910591, 0.25935155153275, 0.25968423485756, 0.25615233182907, 0.24655812978745, 0.5, 0.010069645009935 ], "/Developer/Projects/live-beatbox/samples/Mace.wav": [ 0.68001586198807, -0.08747585862875, 0.20031732320786, 0.45465880632401, 0.24278998374939, 0.15520741045475, 0.39294219017029, 0.31397640705109, 0.23469185829163, 0.29590052366257, 0.29736387729645, 0.30505037307739, 0.26953941583633, 0.28168845176697, 0.24470297992229, 0.26247560977936, 0.23433543741703, 0.20802608132362, 0.23503650724888, 0.26996144652367, 0.5721527338028, 0.4345386326313 ], "/Developer/Projects/live-beatbox/samples/Closed hat 2.wav": [ -0.24041655659676, 0.18434146046638, 0.26875647902489, 0.10452826321125, 0.15270887315273, 0.14445799589157, 0.16138996183872, 0.13709534704685, 0.13576667010784, 0.18001724779606, 0.22938613593578, 0.2194812297821, 0.22518564760685, 0.22839047014713, 0.21999795734882, 0.20800541341305, 0.22956544160843, 0.24266947805882, 0.24234534800053, 0.20933836698532, 1.2266902923584, 0.97205013036728 ], "/Developer/Projects/live-beatbox/samples/Kick 3.wav": [ 1.0011028051376, 0.40234813094139, 0.45889461040497, 0.34455496072769, 0.37960460782051, 0.32668650150299, 0.32158249616623, 0.30030682682991, 0.28383427858353, 0.26678124070168, 0.2560741007328, 0.25409865379333, 0.2597796022892, 0.25882884860039, 0.2586470246315, 0.24702036380768, 0.25080168247223, 0.25776746869087, 0.24555863440037, 0.24333871901035, 0.5, 0.042498268187046 ], + "/Developer/Projects/live-beatbox/samples/Closed hat 5.wav": [ -0.14746677875519, 0.20518408715725, 0.31696575880051, 0.087675958871841, 0.20821140706539, 0.17847244441509, 0.18199095129967, 0.14824746549129, 0.16149520874023, 0.17520378530025, 0.18740993738174, 0.18199309706688, 0.16949005424976, 0.17568406462669, 0.19164322316647, 0.2051462829113, 0.20931321382523, 0.22398208081722, 0.22217744588852, 0.21613308787346, 1.2904230356216, 0.96203035116196 ], "/Developer/Projects/live-beatbox/samples/Kick 5.wav": [ 1.3925746679306, 0.33888247609138, 0.5436674952507, 0.34234488010406, 0.40540197491646, 0.37344381213188, 0.36660873889923, 0.31410774588585, 0.29036098718643, 0.27466267347336, 0.26912334561348, 0.25031274557114, 0.25325891375542, 0.25056770443916, 0.24540962278843, 0.25904276967049, 0.25551190972328, 0.25073948502541, 0.24839524924755, 0.25617578625679, 0.081054776906967, 0.033872157335281 ] ) diff --git a/help/AverageOutput.html b/help/AverageOutput.html new file mode 100644 index 0000000..a6742ab --- /dev/null +++ b/help/AverageOutput.html @@ -0,0 +1,45 @@ + + + + + + + + + + + +

AverageOutput

+


+

The mean average output since the last received trigger.

+


+

Class methods

+


+

*ar(in, trig, mul, add)

+

*kr(in, trig, mul, add)

+


+


+

in - input signal.

+


+

trig -  if changes from <= 0 to > 0, resets average and count to zero.

+


+


+

Examples

+


+

// sine oscillator, average slowly settles to zero

+

a = { AverageOutput.ar(SinOsc.ar(10000)).poll }.play;

+


+

a.free;

+ + diff --git a/plugins/RFWGens.scx b/plugins/RFWGens.scx new file mode 100755 index 0000000..972eb68 Binary files /dev/null and b/plugins/RFWGens.scx differ diff --git a/run.sc b/run.sc new file mode 100644 index 0000000..cc7f58c --- /dev/null +++ b/run.sc @@ -0,0 +1,5 @@ +( +Server.local.doWhenBooted { + BeatBox(Document.current.dir); +}; +) diff --git a/samples/.DS_Store b/samples/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/samples/.DS_Store differ diff --git a/samples/Boosh.wav b/samples/Boosh.wav new file mode 100755 index 0000000..6c0cee7 Binary files /dev/null and b/samples/Boosh.wav differ diff --git a/samples/Clap 1.wav b/samples/Clap 1.wav new file mode 100755 index 0000000..927fe8d Binary files /dev/null and b/samples/Clap 1.wav differ diff --git a/samples/Clap 2.wav b/samples/Clap 2.wav new file mode 100755 index 0000000..ee72f8f Binary files /dev/null and b/samples/Clap 2.wav differ diff --git a/samples/Clap 3.wav b/samples/Clap 3.wav new file mode 100755 index 0000000..4697010 Binary files /dev/null and b/samples/Clap 3.wav differ diff --git a/samples/Clap 4.wav b/samples/Clap 4.wav new file mode 100755 index 0000000..03d6a04 Binary files /dev/null and b/samples/Clap 4.wav differ diff --git a/samples/Clap 5.wav b/samples/Clap 5.wav new file mode 100755 index 0000000..6ba791f Binary files /dev/null and b/samples/Clap 5.wav differ diff --git a/samples/Clap 6.wav b/samples/Clap 6.wav new file mode 100755 index 0000000..67c9a40 Binary files /dev/null and b/samples/Clap 6.wav differ diff --git a/samples/Clap 7.wav b/samples/Clap 7.wav new file mode 100755 index 0000000..7825ba6 Binary files /dev/null and b/samples/Clap 7.wav differ diff --git a/samples/Clap 8.wav b/samples/Clap 8.wav new file mode 100755 index 0000000..1192519 Binary files /dev/null and b/samples/Clap 8.wav differ diff --git a/samples/Closed hat 1.wav b/samples/Closed hat 1.wav new file mode 100755 index 0000000..d83a9b7 Binary files /dev/null and b/samples/Closed hat 1.wav differ diff --git a/samples/Closed hat 2.wav b/samples/Closed hat 2.wav new file mode 100755 index 0000000..642d6b4 Binary files /dev/null and b/samples/Closed hat 2.wav differ diff --git a/samples/Closed hat 3.wav b/samples/Closed hat 3.wav new file mode 100755 index 0000000..163f9f7 Binary files /dev/null and b/samples/Closed hat 3.wav differ diff --git a/samples/Closed hat 4.wav b/samples/Closed hat 4.wav new file mode 100755 index 0000000..36835eb Binary files /dev/null and b/samples/Closed hat 4.wav differ diff --git a/samples/Closed hat 5.wav b/samples/Closed hat 5.wav new file mode 100755 index 0000000..826ee7b Binary files /dev/null and b/samples/Closed hat 5.wav differ diff --git a/samples/Closed hat 6.wav b/samples/Closed hat 6.wav new file mode 100755 index 0000000..6bc0251 Binary files /dev/null and b/samples/Closed hat 6.wav differ diff --git a/samples/Closed hat 7.wav b/samples/Closed hat 7.wav new file mode 100755 index 0000000..f8d2303 Binary files /dev/null and b/samples/Closed hat 7.wav differ diff --git a/samples/Cybertraffic.wav b/samples/Cybertraffic.wav new file mode 100755 index 0000000..0c8ab0d Binary files /dev/null and b/samples/Cybertraffic.wav differ diff --git a/samples/Dang.wav b/samples/Dang.wav new file mode 100755 index 0000000..8263192 Binary files /dev/null and b/samples/Dang.wav differ diff --git a/samples/Jive 1.wav b/samples/Jive 1.wav new file mode 100755 index 0000000..dd6ec0d Binary files /dev/null and b/samples/Jive 1.wav differ diff --git a/samples/Jive 2.wav b/samples/Jive 2.wav new file mode 100755 index 0000000..b684645 Binary files /dev/null and b/samples/Jive 2.wav differ diff --git a/samples/Jive 3.wav b/samples/Jive 3.wav new file mode 100755 index 0000000..170a3db Binary files /dev/null and b/samples/Jive 3.wav differ diff --git a/samples/Jive 4.wav b/samples/Jive 4.wav new file mode 100755 index 0000000..7945ec5 Binary files /dev/null and b/samples/Jive 4.wav differ diff --git a/samples/Kick 1.wav b/samples/Kick 1.wav new file mode 100755 index 0000000..616f1b3 Binary files /dev/null and b/samples/Kick 1.wav differ diff --git a/samples/Kick 10.wav b/samples/Kick 10.wav new file mode 100755 index 0000000..6c8d9df Binary files /dev/null and b/samples/Kick 10.wav differ diff --git a/samples/Kick 2.wav b/samples/Kick 2.wav new file mode 100755 index 0000000..2331200 Binary files /dev/null and b/samples/Kick 2.wav differ diff --git a/samples/Kick 3.wav b/samples/Kick 3.wav new file mode 100755 index 0000000..b54efed Binary files /dev/null and b/samples/Kick 3.wav differ diff --git a/samples/Kick 4.wav b/samples/Kick 4.wav new file mode 100755 index 0000000..2895f2b Binary files /dev/null and b/samples/Kick 4.wav differ diff --git a/samples/Kick 5.wav b/samples/Kick 5.wav new file mode 100755 index 0000000..8a3228d Binary files /dev/null and b/samples/Kick 5.wav differ diff --git a/samples/Kick 7.wav b/samples/Kick 7.wav new file mode 100755 index 0000000..8c120a5 Binary files /dev/null and b/samples/Kick 7.wav differ diff --git a/samples/Kick 8.wav b/samples/Kick 8.wav new file mode 100755 index 0000000..d3ea2b4 Binary files /dev/null and b/samples/Kick 8.wav differ diff --git a/samples/Kick 9.wav b/samples/Kick 9.wav new file mode 100755 index 0000000..97ce46f Binary files /dev/null and b/samples/Kick 9.wav differ diff --git a/samples/Kick a.wav b/samples/Kick a.wav new file mode 100755 index 0000000..67646f1 Binary files /dev/null and b/samples/Kick a.wav differ diff --git a/samples/Kick b.wav b/samples/Kick b.wav new file mode 100755 index 0000000..60eda0f Binary files /dev/null and b/samples/Kick b.wav differ diff --git a/samples/Kick c.wav b/samples/Kick c.wav new file mode 100755 index 0000000..bb735dc Binary files /dev/null and b/samples/Kick c.wav differ diff --git a/samples/Kick d.wav b/samples/Kick d.wav new file mode 100755 index 0000000..74c8a8d Binary files /dev/null and b/samples/Kick d.wav differ diff --git a/samples/Kick e.wav b/samples/Kick e.wav new file mode 100755 index 0000000..8dc486c Binary files /dev/null and b/samples/Kick e.wav differ diff --git a/samples/Kick f.wav b/samples/Kick f.wav new file mode 100755 index 0000000..d5b1ca2 Binary files /dev/null and b/samples/Kick f.wav differ diff --git a/samples/Kick g.wav b/samples/Kick g.wav new file mode 100755 index 0000000..aff30d7 Binary files /dev/null and b/samples/Kick g.wav differ diff --git a/samples/Kick h.wav b/samples/Kick h.wav new file mode 100755 index 0000000..eff534d Binary files /dev/null and b/samples/Kick h.wav differ diff --git a/samples/Kick i.wav b/samples/Kick i.wav new file mode 100755 index 0000000..a5e9a19 Binary files /dev/null and b/samples/Kick i.wav differ diff --git a/samples/Kick j.wav b/samples/Kick j.wav new file mode 100755 index 0000000..d7e6d25 Binary files /dev/null and b/samples/Kick j.wav differ diff --git a/samples/Mace.wav b/samples/Mace.wav new file mode 100755 index 0000000..d2ac966 Binary files /dev/null and b/samples/Mace.wav differ diff --git a/samples/Machine.wav b/samples/Machine.wav new file mode 100755 index 0000000..4e72db1 Binary files /dev/null and b/samples/Machine.wav differ diff --git a/samples/Open hat 2.wav b/samples/Open hat 2.wav new file mode 100755 index 0000000..425a223 Binary files /dev/null and b/samples/Open hat 2.wav differ diff --git a/samples/Open hat 3.wav b/samples/Open hat 3.wav new file mode 100755 index 0000000..967f256 Binary files /dev/null and b/samples/Open hat 3.wav differ diff --git a/samples/Open hat 4.wav b/samples/Open hat 4.wav new file mode 100755 index 0000000..51d50ff Binary files /dev/null and b/samples/Open hat 4.wav differ diff --git a/samples/Open hat 5.wav b/samples/Open hat 5.wav new file mode 100755 index 0000000..56ee16a Binary files /dev/null and b/samples/Open hat 5.wav differ diff --git a/samples/Open hat 6.wav b/samples/Open hat 6.wav new file mode 100755 index 0000000..1f6aae9 Binary files /dev/null and b/samples/Open hat 6.wav differ diff --git a/samples/Open hat 7.wav b/samples/Open hat 7.wav new file mode 100755 index 0000000..105d5eb Binary files /dev/null and b/samples/Open hat 7.wav differ diff --git a/samples/Pacific.wav b/samples/Pacific.wav new file mode 100755 index 0000000..9cfa32e Binary files /dev/null and b/samples/Pacific.wav differ diff --git a/samples/Pie.wav b/samples/Pie.wav new file mode 100755 index 0000000..8e49f33 Binary files /dev/null and b/samples/Pie.wav differ diff --git a/samples/RIDE 1.wav b/samples/RIDE 1.wav new file mode 100755 index 0000000..e2c0698 Binary files /dev/null and b/samples/RIDE 1.wav differ diff --git a/samples/RIDE 2.wav b/samples/RIDE 2.wav new file mode 100755 index 0000000..702467e Binary files /dev/null and b/samples/RIDE 2.wav differ diff --git a/samples/RIDE 3.wav b/samples/RIDE 3.wav new file mode 100755 index 0000000..0d676c4 Binary files /dev/null and b/samples/RIDE 3.wav differ diff --git a/samples/RIDE 4.wav b/samples/RIDE 4.wav new file mode 100755 index 0000000..c567480 Binary files /dev/null and b/samples/RIDE 4.wav differ diff --git a/samples/Regret.wav b/samples/Regret.wav new file mode 100755 index 0000000..b5d3e01 Binary files /dev/null and b/samples/Regret.wav differ diff --git a/samples/Reverse Crash.wav b/samples/Reverse Crash.wav new file mode 100755 index 0000000..ff3d731 Binary files /dev/null and b/samples/Reverse Crash.wav differ diff --git a/samples/Reverse Kickverb 1.wav b/samples/Reverse Kickverb 1.wav new file mode 100755 index 0000000..1ceaf86 Binary files /dev/null and b/samples/Reverse Kickverb 1.wav differ diff --git a/samples/Scrape.wav b/samples/Scrape.wav new file mode 100755 index 0000000..568d727 Binary files /dev/null and b/samples/Scrape.wav differ diff --git a/samples/Shank.wav b/samples/Shank.wav new file mode 100755 index 0000000..cb22129 Binary files /dev/null and b/samples/Shank.wav differ diff --git a/samples/Snare 4.WAV b/samples/Snare 4.WAV new file mode 100755 index 0000000..fdbff59 Binary files /dev/null and b/samples/Snare 4.WAV differ diff --git a/samples/Snare 5.WAV b/samples/Snare 5.WAV new file mode 100755 index 0000000..b147f82 Binary files /dev/null and b/samples/Snare 5.WAV differ diff --git a/samples/Snare 6.WAV b/samples/Snare 6.WAV new file mode 100755 index 0000000..5b74ed8 Binary files /dev/null and b/samples/Snare 6.WAV differ diff --git a/samples/Snare 7.wav b/samples/Snare 7.wav new file mode 100755 index 0000000..0ce6f0d Binary files /dev/null and b/samples/Snare 7.wav differ diff --git a/samples/Snare 8.wav b/samples/Snare 8.wav new file mode 100755 index 0000000..a480b2e Binary files /dev/null and b/samples/Snare 8.wav differ diff --git a/samples/Woosh.wav b/samples/Woosh.wav new file mode 100755 index 0000000..24f8f55 Binary files /dev/null and b/samples/Woosh.wav differ diff --git a/samples/fx 1.wav b/samples/fx 1.wav new file mode 100755 index 0000000..b5534b0 Binary files /dev/null and b/samples/fx 1.wav differ diff --git a/samples/fx 2.wav b/samples/fx 2.wav new file mode 100755 index 0000000..63a3c7c Binary files /dev/null and b/samples/fx 2.wav differ diff --git a/samples/jrev.wav b/samples/jrev.wav new file mode 100755 index 0000000..4059c9e Binary files /dev/null and b/samples/jrev.wav differ diff --git a/samples/revent.wav b/samples/revent.wav new file mode 100755 index 0000000..a3b57ba Binary files /dev/null and b/samples/revent.wav differ diff --git a/samples/snare 1.wav b/samples/snare 1.wav new file mode 100755 index 0000000..e066072 Binary files /dev/null and b/samples/snare 1.wav differ diff --git a/samples/snare 2.wav b/samples/snare 2.wav new file mode 100755 index 0000000..0016527 Binary files /dev/null and b/samples/snare 2.wav differ diff --git a/samples/snare 3.wav b/samples/snare 3.wav new file mode 100755 index 0000000..da08a01 Binary files /dev/null and b/samples/snare 3.wav differ diff --git a/scanlib.sc b/scanlib.sc new file mode 100644 index 0000000..61905e5 --- /dev/null +++ b/scanlib.sc @@ -0,0 +1,40 @@ +// This is the script I used to batch analyse a directory of audio samples. + +// It scans a directory, analyses each suitable audio +// sample found and stores the results in the environment variable +// ~output. + +// This output should be saved in a file called "data.sc" in the root directory. + +// At present sound samples are limited to 1 second in length.. + + +// TODO improve this system! + + +( +var maxFrames = 44100; +var path = Document.current.dir ++ "/samples/".standardizePath; // edit to your path +var files = (path ++ "*.wav").pathMatch; +~output = (); + +Routine { + files.do { |fname| + var len; + + try { + Post << "Processing " << fname << $\n; + + Beat.newFromPath(fname, s) { |beat| + beat.analyse { |beat| + ~output[fname] = beat.features; + }; + }; + } { |error| + error.errorString.postln; + }; + + 1.wait + }; +}.play; +) diff --git a/sounds-README b/sounds-README new file mode 100644 index 0000000..2b6db9c --- /dev/null +++ b/sounds-README @@ -0,0 +1 @@ +the included sounds come from the public domain "Alex Calver Sample Pack" \ No newline at end of file diff --git a/src/RFWGens.cpp b/src/RFWGens.cpp new file mode 100644 index 0000000..e4207c7 --- /dev/null +++ b/src/RFWGens.cpp @@ -0,0 +1,85 @@ +/* + SuperCollider real time audio synthesis system + Copyright (c) 2002 James McCartney. All rights reserved. + http://www.audiosynth.com + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +//ACMC demo UGen + +#include "SC_PlugIn.h" + +static InterfaceTable *ft; + +struct AverageOutput : public Unit { + float average, prev_trig; + uint32 count; +}; + +extern "C" { + void AverageOutput_next(AverageOutput *unit, int inNumSamples); + void AverageOutput_Ctor(AverageOutput* unit); + void AverageOutput_Dtor(AverageOutput* unit); +} + + +void AverageOutput_Ctor( AverageOutput* unit ) { + unit->average = 0.; + unit->count = 0; + unit->prev_trig = 0.; + + RGen& rgen = *unit->mParent->mRGen; + + SETCALC(AverageOutput_next); +} + +void AverageOutput_Dtor(AverageOutput *unit) { + // nothing to do here +} + +void AverageOutput_next( AverageOutput *unit, int inNumSamples ) { + int i; + float *in = IN(0); + float *out = ZOUT(0); + float trig = ZIN0(1); + float prev_trig = unit->prev_trig; + double average = unit->average; + uint32 count = unit->count; + + if(prev_trig <= 0. && trig > 0.) { + average = 0.; + count = 0; + } + + for (i=0; iprev_trig = trig; + unit->count = count; + unit->average = average; +} + +extern "C" void load(InterfaceTable *inTable) { + + ft = inTable; + + DefineDtorUnit(AverageOutput); + +} + + diff --git a/src/install.sh b/src/install.sh new file mode 100755 index 0000000..9add884 --- /dev/null +++ b/src/install.sh @@ -0,0 +1 @@ +cp /Applications/SuperCollider3/build/plugins/RFWGens.scx /l/cm2/coursework/task3/plugins diff --git a/synthdefs.sc b/synthdefs.sc new file mode 100644 index 0000000..1d85449 --- /dev/null +++ b/synthdefs.sc @@ -0,0 +1,47 @@ +SynthDef(\beatboxlistener) { |out=0, in=0, amp=1.0, threshold=0.3, lag=0.1, t_resetRecord=0.0, fftbuf, recbuf| + var input, chain, onsets, peak; + + input = SoundIn.ar(in); + chain = FFT(fftbuf, input); + onsets = Onsets.kr(chain, threshold, \rcomplex); + peak = PeakFollower.ar(input, 0.01).lag(lag); + + RecordBuf.ar(input, bufnum: recbuf, trigger: t_resetRecord); + + SendTrig.kr(onsets, value: 1); + SendTrig.ar((peak < 0.0002), value: 2); + + Out.ar(out, input * amp); +}.load(s); + +// TODO Envelope recognition? This is pretty good at selecting timbres but often the envelopes +// of the two sounds (perceptually just as important??) are very different. +SynthDef(\beatboxanalyzer) { |out=0, fftbuf, bufnum, cbus1, cbus2, cbus3, t_reset=0.0| + var sig, inbuf, chain, coeffs, centroid, zcr; + + sig = PlayBuf.ar(numChannels: 1, bufnum:bufnum); + chain = FFT(fftbuf, sig, wintype: 1); // Hann windowing + coeffs = MFCC.kr(chain, 20); + centroid = SpecCentroid.kr(chain).linlin(100, 10000, 0, 1.5, \minmax); // perhaps a slight weighting + zcr = ZeroCrossing.ar(sig).linlin(100, 10000, 0, 1.5, \minmax); // towards these two + + Out.kr(cbus1, AverageOutput.kr(coeffs, trig: t_reset)); + Out.kr(cbus2, AverageOutput.kr(centroid, trig: t_reset)); + Out.kr(cbus3, A2K.kr(AverageOutput.kr(zcr, trig: t_reset))); +}.load(s); + + +SynthDef(\beatboxplayer) { |out=0, bufnum1, bufnum2, crossfade=0.0, mul=1.0| + var p1 = PlayBuf.ar(numChannels: 1, loop: 0, bufnum: bufnum1); + var p2 = PlayBuf.ar(numChannels: 1, loop: 0, bufnum: bufnum2); + var amp1 = 1 - crossfade; + var amp2 = crossfade; + var dur = BufDur.kr(bufnum1); + var env = EnvGen.kr(Env([1,1,0], [dur * 0.9, dur])); + + Out.ar(out, + mul * Pan2.ar( + (((p1 * 0.5) * (env * amp1)) + ((p2 * 0.5) * (env * amp2))); + ) + ); +}.load(s);