|
| 1 | +( |
| 2 | +Server.default.options.numInputBusChannels = 8; |
| 3 | +s.boot; |
| 4 | +) |
| 5 | + |
| 6 | +( |
| 7 | +SynthDef(\analyzer, { |
| 8 | + arg in=0, threshold=0.1, relaxtime=0.05; |
| 9 | + var onset1, s1, lv1; |
| 10 | + var sdel = 0.04; // this is a small delay to skip the first chaotic miliseconds |
| 11 | + |
| 12 | + var sound_in = HPF.ar(SoundIn.ar(in), 30); |
| 13 | + |
| 14 | + var amp = WAmp.kr(sound_in, sdel); |
| 15 | + |
| 16 | + var f0 = Pitch.kr(sound_in, 300, |
| 17 | + ampThreshold:0.001, peakThreshold:0.5, minFreq:30, maxFreq:8000, median:5 |
| 18 | + )[0]; |
| 19 | + |
| 20 | + var onsets = Onsets.kr(FFT(LocalBuf(2048), sound_in, wintype:1), threshold, \wphase,//\rcomplex, |
| 21 | + relaxtime:relaxtime, floor:0.1, mingap:1, medianspan:11, whtype:1, rawodf:0); |
| 22 | + |
| 23 | + var delay_onsets = DelayN.kr(onsets, sdel, sdel); |
| 24 | + |
| 25 | + // onsets.poll(5); |
| 26 | + |
| 27 | + SendReply.kr(delay_onsets, '/analysis', [amp, f0]); |
| 28 | +}).add; |
| 29 | +) |
| 30 | + |
| 31 | +( |
| 32 | +~analyzer!?(_.free); |
| 33 | +~analyzer = Synth(\analyzer, [\in, 6, \threshold, 0.1]); |
| 34 | +) |
| 35 | + |
| 36 | +( |
| 37 | +~clear_pending_events.(); |
| 38 | +b.sendMsg("/predictor/reset"); |
| 39 | +~release_all.(0); |
| 40 | +~allow_end = false; |
| 41 | +~duet = true; |
| 42 | +~do_synth = false; |
| 43 | +~player_sound = true; |
| 44 | +~player_inst = 43; |
| 45 | +~last_pitch = nil; |
| 46 | +~gate = false; |
| 47 | + |
| 48 | +OSCdef(\analysis, { |
| 49 | + arg msg; |
| 50 | + var amp = msg[3]; |
| 51 | + var f0 = msg[4]; |
| 52 | + var vel = (amp.pow(0.5)*126+1).round.asInteger; |
| 53 | + var pitch = f0.cpsmidi.round.asInteger; |
| 54 | + |
| 55 | + |
| 56 | + ~last_pitch.notNil.if{ |
| 57 | + MIDIdef.all[\input_off].func.value(0, ~last_pitch)}; |
| 58 | + MIDIdef.all[\input_on].func.value(vel, pitch); |
| 59 | + |
| 60 | + ~last_pitch = pitch; |
| 61 | + |
| 62 | +}, "/analysis") |
| 63 | +) |
| 64 | + |
| 65 | +( |
| 66 | +~clear_pending_events.(); |
| 67 | +~release_all.(0); |
| 68 | +) |
| 69 | + |
| 70 | + |
| 71 | +// ~analyzer.set(\threshold, 0.1) |
| 72 | + |
| 73 | +// OSCdef.trace |
0 commit comments