From 8a74f8612f2308eb0073e0e43a255858ef541892 Mon Sep 17 00:00:00 2001 From: Mike Lynch Date: Sun, 2 Apr 2023 16:31:52 +1000 Subject: [PATCH] Multitrack is working for recording --- NOTES.md | 33 ++++++++------------------------- grains.scd | 54 +++++++++++++++++++++++++++++++++--------------------- 2 files changed, 41 insertions(+), 46 deletions(-) diff --git a/NOTES.md b/NOTES.md index 151fa96..1250418 100644 --- a/NOTES.md +++ b/NOTES.md @@ -1,31 +1,14 @@ # TODO -## Granulator +- quantise playback speed to rational values +- display the playback and harmonics when quantised -Fix chorus and detune - why isn't it being triggered? +- multiple grain buffers - TouchOsc interface to select which to send to +- play back all buffers? -Add pitch shifting - -Change harmonics for chorus - -Lock harmonics to octaves / ratios - -## Effects chain - -Add an effects chain like with midilooper - --> filter -> reverb -> out +- rhythm controls + - number of steps in step granulator + - modulate grain level in time with playback + - sync LFOs to playback - -## LFO mod - -Add the new-style lfo mods to filter - -## More LFO mods - -Allow other settings to be modulated - -## Input filter - -Switch in and out a single input filter like distort, peak FFT, etc, \ No newline at end of file diff --git a/grains.scd b/grains.scd index a80987b..ea488df 100644 --- a/grains.scd +++ b/grains.scd @@ -217,23 +217,32 @@ fork { ~makebuffers.value(); -~bufrecorder = SynthDef( +SynthDef( \fripp_record, { - arg in = 2, fb = 4, bufindex = 0, mix = 0.25, record = 0.0, feedback = 0.0; + arg in = 2, buffer = 0, mix = 0.25, record = 0.0; var insig = record * In.ar(in, 1); - RecordBuf.ar(insig, ~frippbuffers[bufindex], 0, mix, 1 - mix, loop: 1) + RecordBuf.ar(insig, buffer, 0, mix, 1 - mix, loop: 1) } -).play(s, [ - \in, ~recordb, - \record, 1.0, -// \fb, ~granulatorb, - \out, 0, - \bufindex, ~currentfripp, - \addToTail -] -); +).add; +~bufrecorders = Array.new(~ntracks); + +~frippbuffers.do({ + | buffer, index | + ~bufrecorders.add(Synth.new( + \fripp_record, + [ + \in, ~recordb, + \record, 0.0, + \buffer, buffer + ], + s, + \addToTail + )) +}); + +~bufrecorder = ~bufrecorders[0]; // the main granulator synth @@ -347,14 +356,15 @@ OSCdef.freeAll; ~to.button('/reset', 0, { | v | if( v > 0, { - var sp = ~to.v('/grains/speed')[0]; - ~buflen = ~to.v('/grains/buflen'); - [ "resetting buffers to", ~buflen ].postln; - ~makebuffers.value(); - ~granulator.set(\buffer, ~frippbuffers[~currentfripp]); - ~bufrecorder.set(\buffer, ~frippbuffers[~currentfripp]); - - ~playbacklfo.set(\speed, sp / ~buflen); + "TODO: rewrite this for multitrack".postln; + // var sp = ~to.v('/grains/speed')[0]; + // ~buflen = ~to.v('/grains/buflen'); + // [ "resetting buffers to", ~buflen ].postln; + // ~makebuffers.value(); + // ~granulator.set(\buffer, ~frippbuffers[~currentfripp]); + // ~bufrecorder.set(\buffer, ~frippbuffers[~currentfripp]); + // + // ~playbacklfo.set(\speed, sp / ~buflen); }); }); @@ -362,8 +372,10 @@ OSCdef.freeAll; ~to.button('/track', 0, { |v| var buffer = ~frippbuffers[v]; if( buffer.isNil.not, { + ~bufrecorder.set(\record, 0.0); + ~bufrecorder = ~bufrecorders[v]; + ~bufrecorder.set(\record, ~to.v('/record')); ~granulator.set(\buffer, buffer); - ~bufrecorder.set(\buffer, buffer); [ "set track to", v, buffer ].postln; }, { [ "Bad track index", v ].postln;