Add multitrack prototype
authorEugene Petkevich <nasedil.genio.code@gmail.com>
Wed, 14 Dec 2022 03:04:53 +0000 (04:04 +0100)
committerEugene Petkevich <nasedil.genio.code@gmail.com>
Wed, 14 Dec 2022 03:04:53 +0000 (04:04 +0100)
extensions/classes/midihandler.sc
extensions/classes/midiremotesl.sc
Хэзифу/multitrack.scd [new file with mode: 0644]

index 518306f..0bf7f2d 100644 (file)
@@ -9,6 +9,8 @@ MidiHandler {
     };
   }
 
+  // midiNames[0] should be Midi Device name
+  // midiNames[1] should include Midi port name
   midiInit {
     var dest;
     dest = MIDIClient.destinations.detect({ |item|
index 196f1c7..c758c26 100644 (file)
@@ -31,7 +31,7 @@ MidiRemote25SL : MidiHandler {
   var <>rewind, <>forward, <>stop, <>bplay, <>loop, <>brec;
   var <>pad;
 
-  *new {|name='Novation SL25 ReMOTE MKII', midiNames=#["ReMOTE SL", ["ReMOTE SL MIDI 1", "ReMOTE SL MIDI 1"]], reveal=true|
+  *new {|name='Novation SL25 ReMOTE MKII', midiNames=#["ReMOTE SL", ["ReMOTE SL MIDI 1", "Port 1"]], reveal=true|
     ^super.newCopyArgs(name, midiNames, reveal).midiInit.controlInit;
   }
 
@@ -47,7 +47,10 @@ MidiRemote25SL : MidiHandler {
   }
 
   controlInit {
-    idin2 = MIDIClient.sources.detect{|i| i.name == "ReMOTE SL MIDI 2"}.uid;
+    idin2 = MIDIClient.sources.detect{ |i|
+      (i.device == midiNames[0])
+      .and(["ReMOTE SL MIDI 2", "Port 2"].includesEqual(i.name))
+    }.uid;
 
     // key pressed/released
     MIDIdef.noteOn((\keyDown++name).asSymbol, {|...args|
diff --git a/Хэзифу/multitrack.scd b/Хэзифу/multitrack.scd
new file mode 100644 (file)
index 0000000..7fbd061
--- /dev/null
@@ -0,0 +1,71 @@
+~ke = MidiRemote25SL(\kedifu);
+
+(
+SynthDef(\zuFader, {|in, amp=1.0, out=0|
+  Out.ar(out, In.ar(in, 2) * amp);
+}).add;
+)
+
+(
+// Multitrack class
+/*
+~trackFactory = {
+  (
+    name: \mumy,
+    def:
+  )
+};
+*/
+
+~trackerFactory = {
+  (
+    tracks: [\lonu, \fose, \ziba, \pepo, \kaco, \xehi, \puso, \nuhu],
+    groups: Array(8),
+    buses: Array(8),
+    faders: Array(8),
+    init: {|self|
+      self.sourceGroup = Group();
+      self.faderGroup = Group.after(self.sourceGroup);
+      self.kedifu = MidiRemote25SL(\kedifuTracker, reveal: false);
+      self.tracks.do{|k, i|
+        var group, bus, fader;
+        Pdef(k).endless;
+        self[k] = Pdef(k);
+        self[(k ++ \_).asSymbol] = {|self, f| Pdef(k, f)};
+        group = Group(self.sourceGroup);
+        self.groups.add(group);
+        bus = Bus.audio(numChannels: 2);
+        self.buses.add(bus);
+        Pdef(k).set(\group, group, \out, bus);
+        fader = Synth(\zuFader, [in: bus, out: 0], self.faderGroup);
+        self.faders.add(fader);
+      };
+      self.kedifu.fader_{|v, n|
+        self.faders[n].bindRange(\amp, -60.dbamp, 0.dbamp).value(v);
+      };
+      self
+    },
+  )
+};
+)
+~tracker = ~trackerFactory.value.init;
+
+(
+~tracker.lonu_{
+  Pbind(*[
+    instrument: \naje,
+    db: Pwhite(-9, -6!2),
+    dur: Prand((1!43)++(2!14)++(3!51)++(4!31), inf)/4,
+    pan: Pwhite(-0.7, 0.7!2, inf),
+    scale: Scale.nahawand,
+    octave: Pseq([2, 2, 2, 3, 3, 2, 3, 4, 3, 4], inf) + [2, 6],
+    degree: Pseq([0, 4, 5, 7, 6, 1], inf),
+    legato: Pwhite(0.8, 1.3!2, inf),
+    cut: Pwhite(600, 900!2),
+    rez: Pwhite(0.7, 0.9!2),
+    modFreqMin: Pwhite(6, 8!2),
+    modFreqMax: Pwhite(11, 13!2),
+    modAmp: Pwhite(0.01, 0.02!2),
+  ])
+}.quant_(7).play;
+)