Osmosis
By horatiuromantic on April 5, 2026 11:05 pm
HOLA everybody. I bring to you a pretty insane solo performance called Osmosis. It's only 17:59, so you could listen to it in the "songs that last 18 minutes or less" category I guess lol. It's just me and my trusty Nord Electro 2 from ~2009, and a little bit of magic. Read below to learn how I did it, or just listen and enjoy.
NO AI was used here, however some coding was involved. Levi the Drummer is after all a computer program, but what I did here is the apex of technology as I am sure many programmers will agree: it's all if-else statements!!! The code is attached.
› Lore and process
‹ Lore and process
Osmosis is the process of water passing through a cell membrane, being absorbed by an organism (I guess it has other definitions and I don't really understand it - I just know it's when something kinda merges into another thing - I was looking for the opposite of mitosis but that's not really it).
The backstory here is that Levi the drummer was causing problems inside Logic, and I couldn't really use him anymore, so I looked for alternate ideas, and I realized the power was in my fingers all along - what if I BECOME Levi the drummer? So I hooked up the keys to drums: certain keys hit kicks, others hit snares, others open/closed hats or cymbals (with or without the kick), WHILE I play regularly. My plan is anyway to do the bass in the left hand, so this is just an extra little detail. And I hooked the drums up vaguely to the composition - I had a little idea in Eb, but it also evolved with the drum sounds as I experimented. Therefore, the mapping is as follows:
var kicks = ["Bb1", "C2", "F2", "G2", "Eb1"];
var snares = ["F1", "Bb2", "Ab1", "Eb2"];
var sidesticks = ["F#1", "D2", "Ab2", "C3"];
// event.pitch is the midi value of the note: C1 = 36, C#1 is 37 etc.
if (event.pitch % 14 == 0) { } // that's a crash + kick. so like Ab2, Bb3 and C5 I think.
// highest octave is rides instead of hats
if (event.pitch > Map("C5")) {
event.pitch = getride(event.pitch % 4);
// everything else is hi hat, except if event.pitch is divisible by 5, in which case it's open hi hat.
What the hell are you talkin about Horatiu? What code is this? Well it's javascript of course, and you can add it to an instrument channel in Logic in a "Scripter" midi FX plugin, built in, and it literally gives you an event with the midi notes or knobs that it detects, and you can manipulate it. So it's basically a translation of the keys that I'm playing, but applied to a drum instrument. Coding is great! Full script below if you want to try it out for yourself or just read it for fun!
› Levi's code
‹ Levi's code
// this is how to make custom controls in the plugin window
var PluginParameters = [{
name: "Key", defaultValue: 1, minValue: 0, maxValue: 127,
numberOfSteps: 127, unit: "units", type: "lin"
}];
// you get it via GetParameter("Custom1");
var kicks = ["Bb1", "C2", "F2", "G2", "Eb1"];
var snares = ["F1", "Bb2", "Ab1", "Eb2"];
var sidesticks = ["F#1", "D2", "Ab2", "C3"];
function getkick() { return Map("C1"); }
function getsnare() { return Map("D1"); }
function getsidestick() { return Map("Db1"); }
function gethat() { return Map("F#1"); }
function getfoothat() { return Map("G#1"); }
function getopenhat() { return Map("A#1"); }
function getcrash() { return Map("Db2"); }
function getride(variation) { return variation == 0 ? Map("Eb2") : variation == 1 ? Map("E2") : variation == 2 ? Map("F2") : Map("A2"); }
function HandleMIDI(event) {
var send = false;
//if (event.pitch >= Map("C3"))
// send = false;
// map kicks
for (var i = 0; i < kicks.length; i++) {
if (event.pitch == Map(kicks[i])) {
send = true;
event.pitch = getkick();
break;
}
}
// snares
for (var i = 0; i < snares.length; i++) {
if (event.pitch == Map(snares[i])) {
send = true;
event.pitch = getsnare();
break;
}
}
// sides (for some reason is broken, only ever plays regular snares)
for (var i = 0; i < sidesticks.Length; i++) {
if (event.pitch == Map(sidesticks[i])) {
send = true;
event.pitch = getsidestick();
break;
}
}
if (!send) {
if (event.pitch % 14 == 0) {
send = true;
event.pitch = getcrash();
// also send kick
if (event instanceof NoteOn) {
var newKick = new NoteOn();
newKick.pitch = getkick();
newKick.velocity = event.velocity;
newKick.send();
}
}
else {
// highest octave is rides instead of hats
if (event.pitch > Map("C5")) {
event.pitch = getride(event.pitch % 4);
send = true;
} else {
if (event.pitch % 5 == 0) {
send = true;
event.pitch = getopenhat();
} else {
send = true;
event.articulationID = event.pitch % 6;
event.pitch = gethat();
}
}
}
}
if (send) {
if (event instanceof NoteOn)
event.trace();
event.send();
}
}
function Map(noteName) {
// C1 is 36
// C#1 is 37
// Db1 is also 37
// D1 is 38
// D#1 is 39
// Eb1 is also 39
// etc
// get the octave and do the math
var octave = noteName.charAt(noteName.length - 1);
var note = noteName.substring(0, noteName.length - 1);
var noteValue = 36;
switch (note[0]) {
case 'C':
noteValue = 36;
break;
case 'D':
noteValue = 38;
break;
case 'E':
noteValue = 40;
break;
case 'F':
noteValue = 41;
break;
case 'G':
noteValue = 43;
break;
case 'A':
noteValue = 45;
break;
case 'B':
noteValue = 47;
break;
}
if (note.length > 1) {
switch (note[1]) {
case '#':
noteValue++;
break;
case 'b':
noteValue--;
break;
}
}
return noteValue + ((octave - 1) * 12);
}
Btw I'm using ujam VD-DEEP, a plugin I got for free with my audio interface. It can do beats on its own, but I'm using it to trigger the drum sounds.
Alright, so once I hooked up the script, I tried a few things, going very minimal or adding toms or such, but the balance you hear is what felt right for this track, and v inspiring that I could change the organ/piano sound and still keep the drums but get a totally different vibe. And when I went to E minor and only had the jazz like hi hat I was like daaaaamn very cool emergent drumming heheh - play different keys, get different beats.
I think this method is rife for many interesting compositions, and it really forces me to be as good as possible with rhythm, because one thing is to have the bass, but another is to have BOTH bass and drums. I can be a little loose with the bass as long as the drums are on a metronome, but here even tho it's tight together, they can really go to shit if I lose the tempo. And there is LOADS of that during the performance, so I hope it's not unlistenable but I really am enjoying it hahah - AND after a few minutes I really get into it... I tried many takes and the start is really the most janky.
Also v happy with the composition, it will be SUPER fun to play with my human drummer, I can't wait to see what happens.
Small note on the rest of the gear: I used the Nord electro 2 organ and e piano, and the UAD spark leslie speaker, hooked to the pedal for changing the speed (this is what made Levi quit). I also used the built-in Nord leslie at times, so that's when I got that crazy effect of two leslies going through each other, I turn it on and off. I had the signal going thru a bass amp sim as well, in parallel, to beef up the bass. I feel like I did a bit better job mixing it than last time, but it's really pretty much the live version plus soundgoodizer, and I didn't test it on the phone speakers. Use headphones or monitors please. Finally, I also added a bit of galaxy tape echo on drums and keys, and minor tape saturation and compression.
Hmm I don't know if I forgot anything but well. Today I also played some acoustic piano for a group of contemporary dancers, very fun and energetic - the track was recorded just before and I went with such good energy, and I played my ass off and got everybody to jump around.
Oh and I ordered my new piano (secret model, will share later) but it will come only in two weeks due to easter and some other nonsense. But I went to a shop to try pianos and it's AMAZING, and I also tried a huge 1 million DKK Steinway D from 1970. Oh my stars. What a jam. But hey the new piano will be amazing for all kinds of sounds - I really feel like I am finally getting a real instrument, and have only been messing around so far with these fake ones on the laptop and the old kinda toy one Nord Electro 2 - it's quite dated at this point. The piano sample on it is like 25mb, in the context of piano libraries these days being into the 25 GIGS - thousand times more basically. It sounds like it too. But the hammond clone is very solid tho. Anyway, long overdue an update.
Oh man. Lotta talk. Thanks for reading and listening, you probably still have a long way to go in the track.
Please leave a comment, I love to read your impressions in as much detail as you like. Consider the sound and the composition and all and if you have any advice to make my playing better and more funky in the future... THANKS!
Audio works licensed by author under:
Copyright All rights reserved
- Play
- Download