Add midi adaptens for linuxsampler, hydrogen, amsynth, yamaha dtx drums
authorEugene Petkevich <nasedil.genio.code@gmail.com>
Tue, 5 Jul 2022 08:52:52 +0000 (11:52 +0300)
committerEugene Petkevich <nasedil.genio.code@gmail.com>
Tue, 5 Jul 2022 08:52:52 +0000 (11:52 +0300)
extensions/classes/midiamsynth.sc [new file with mode: 0644]
extensions/classes/mididtx.sc [new file with mode: 0644]
extensions/classes/midihydrogen.sc [new file with mode: 0644]
extensions/classes/midilinuxsampler.sc [new file with mode: 0644]
startup.scd
Хэзифу/test.scd

diff --git a/extensions/classes/midiamsynth.sc b/extensions/classes/midiamsynth.sc
new file mode 100644 (file)
index 0000000..bfb0580
--- /dev/null
@@ -0,0 +1,21 @@
+MidiAmsynth : MidiHandler {
+
+  *new {|name='amsynth', midiNames=#["amsynth", ["MIDI IN"]], reveal=true|
+    ^super.newCopyArgs(name, midiNames, reveal).midiInit.controlInit;
+  }
+
+  controlInit {
+    midiout.latency_(Server.default.latency);
+    "Amsynth is connected to supercollider";
+  }
+
+  makeSynthBind {
+    ^Pbind(
+      \type, \midi,
+      \midiout, this.midiout,
+      \midicmd, \noteOn,
+      \chan, 1,
+    )
+  }
+
+}
\ No newline at end of file
diff --git a/extensions/classes/mididtx.sc b/extensions/classes/mididtx.sc
new file mode 100644 (file)
index 0000000..a6c19f1
--- /dev/null
@@ -0,0 +1,61 @@
+MidiDtxDrums : MidiHandler {
+  classvar notes;
+  var <>pedalHiHat, <>closedHiHat, <>openHiHat, <>snare, <>rimShot, <>sideStick, <>bassDrum, <>tomHi, <>tomMid, <>tomLo, <>cCrash, <>ride, <>foot;
+
+  *new {|name='DTX drums', midiNames=#["DTX drums", ["DTX drums MIDI 1"]], reveal=true|
+    ^super.newCopyArgs(name, midiNames, reveal).midiInit.controlInit;
+  }
+
+  *initClass {
+    notes = IdentityDictionary[
+      44 -> \pedalHiHat,
+      42 -> \closedHiHat,
+      46 -> \openHiHat,
+      38 -> \snare,
+      40 -> \rimShot,
+      37 -> \sideStick,
+      36 -> \bassDrum,
+      48 -> \tomHi,
+      47 -> \tomMid,
+      43 -> \tomLo,
+      49 -> \cCrash,
+      51 -> \ride,
+    ];
+  }
+
+  controlInit {
+    // drum hit
+    MIDIdef.noteOn((\hit++name).asSymbol, {|...args|
+      var handler, drumName;
+      drumName = notes[args[1]];
+      handler = this.perform(drumName);
+      handler.value(args[0].linlin(0, 127, 0, 1), *args);
+    }, notes.keys.asArray, srcID: idin);
+
+    MIDIdef.cc((\foot++name).asSymbol, {|...args|
+      foot.value(args[0].linlin(0, 127, 0, 1), *args);
+    }, 4, srcID: idin);
+
+    // initialize handlers with revealing code
+    [
+      \pedalHiHat, \closedHiHat, \openHiHat, \snare, \rimShot,
+      \sideStick, \bassDrum, \tomHi, \tomMid, \tomLo, \cCrash, \ride, \foot
+    ].do{|handlerName|
+      this.perform((handlerName++\_).asSymbol, {|...args|
+        this.noCallback(handlerName, *args);
+      });
+    };
+
+    "Зацатя готов к использованию 😊".postln;
+  }
+
+  free {
+    [
+      \hit, \foot
+    ].do{|prefix|
+      var defName = (prefix ++ name).asSymbol;
+      MIDIdef(defName).free;
+    };
+  }
+
+}
\ No newline at end of file
diff --git a/extensions/classes/midihydrogen.sc b/extensions/classes/midihydrogen.sc
new file mode 100644 (file)
index 0000000..cff6a19
--- /dev/null
@@ -0,0 +1,51 @@
+MidiHydrogen : MidiHandler {
+  classvar gmrock;
+
+  *new {|name='Hydrogen', midiNames=#["Hydrogen", ["Hydrogen Midi-In", "Hydrogen Midi-Out"]], reveal=true|
+    ^super.newCopyArgs(name, midiNames, reveal).midiInit.controlInit;
+  }
+
+  *initClass {
+    gmrock = IdentityDictionary[
+      \bass -> 36,
+      \side -> 37,
+      \snare -> 38,
+      \clap -> 39,
+      \rim -> 40,
+      \tomfloor -> 41,
+      \hatclosed -> 42,
+      \tomlow -> 43,
+      \hatpedal -> 44,
+      \tomhigh -> 45,
+      \hatopen -> 46,
+      \cowbell -> 47,
+      \ride -> 48,
+      \ccrash -> 49,
+      \ride2 -> 50,
+      \splash -> 51,
+      \hatsemiopen -> 52,
+      \bell -> 53,
+    ];
+    gmrock.know = true;
+  }
+
+  controlInit {
+    midiout.latency_(Server.default.latency);
+    "Hydrogen is connected to supercollider";
+  }
+
+  makeSynthBind {
+    ^Pbind(
+      \type, \midi,
+      \midiout, this.midiout,
+      \midicmd, \noteOn,
+      \chan, 1,
+    )
+  }
+
+}
+
+/*
+~hi = MidiHydrogen();
+
+*/
\ No newline at end of file
diff --git a/extensions/classes/midilinuxsampler.sc b/extensions/classes/midilinuxsampler.sc
new file mode 100644 (file)
index 0000000..8ee9458
--- /dev/null
@@ -0,0 +1,21 @@
+MidiLinuxSampler : MidiHandler {
+
+  *new {|name='LinuxSampler', midiNames=#["LinuxSampler", ["Port 0"]], reveal=true|
+    ^super.newCopyArgs(name, midiNames, reveal).midiInit.controlInit;
+  }
+
+  controlInit {
+    midiout.latency_(Server.default.latency);
+    "LinuxSampler is connected to supercollider";
+  }
+
+  makeSynthBind {
+    ^Pbind(
+      \type, \midi,
+      \midiout, this.midiout,
+      \midicmd, \noteOn,
+      \chan, 1,
+    )
+  }
+
+}
\ No newline at end of file
index 06ed20d..8dde760 100644 (file)
@@ -33,6 +33,17 @@ SynthDef(\buti, {|out=0, amp=1, pan=0, t_trig=0, accent=0.1, freq=200, tone=0.5,
   Out.ar(out, sig);
 }).add;
 
+// fm-synth pulse
+SynthDef(\dire, { |amp=1, out=0, freq=440, gate=1|
+  var sig, modFreq, env;
+  modFreq = SinOsc.ar(3000, mul: freq/4, add: freq);
+  sig = Pulse.ar(modFreq);
+  env = EnvGen.ar(Env.adsr(), gate, doneAction: 2);
+  sig = sig * env;
+  sig = Pan2.ar(sig, Rand(-0.5, 0.5));
+  Out.ar(out, sig * amp);
+}).add;
+
 // Subtract synth pad
 SynthDef(\dyti, {
   | out=0, gate=1, freq=440, amp=1, pan=0, doneAction=2, cut=800, rez=0.8,
index 3e93037..e391027 100644 (file)
@@ -136,7 +136,25 @@ s.waitForBoot{
 //=============================================================================
 
 ~kedi = MidiRemote25SL();
+~kedi2 = MidiRemote25SL(\kedi2);
 
 ~monokeys = KeySynthRelative(~kedi);
 ~monokeys.synthName = \dyti;
-~monokeys.intervals = #[5];
+~monokeys.bendRadius = 0.2;
+~monokeys.centerKey = 67;
+~monokeys.intervals = #[2, 5, 7];
+
+~monokeys.params[\modAmp] = 0.0;
+(
+~kedi.press_{|v|
+  var val = v * 0.02;
+  ~monokeys.group.set(\modAmp, val);
+  ~monokeys.params[\modAmp] = val;
+};
+)
+
+~monokeys2 = KeySynthRelative(~kedi2, centerKey: 52, intervals: #[2, 3]);
+~monokeys2.amp = 2;
+~monokeys2.synthName = \pope;
+~monokeys2.bendRadius = 0.2;
+~monokeys.intervals = #[2, 5, 7];
\ No newline at end of file