4. Februar 2025
Oktav-Arpeggios mit Random-MIDI-Parametern im Logic Pro Scripter
Mit dem Logic Pro Scripter kannst du, direkt in Logic, eigene MIDI-Plug-ins, wie z.B. Arpeggiatoren, Chord Trigger, Harmonizer oder Zufallsgeneratoren in JavaScript programmieren.
Ich bin ja seit eh und je sehr begeistert von Ólafur Arnalds‘ „Stratus“. In Stratus wird, begleitend zum gespielten Klavier-Ton, eines von 8 Patterns, bestehend aus Oktav-Arpeggios, abgespielt. Das klingt ganz fantastisch – die Variation hält sich allerdings in Grenzen. Zwar gibt es mehrere Patches, aber innerhalb eines Patches lediglich einen Klavier-Sound und 8 Patterns.
Mit ein paar Zeilen JavaScript habe ich jetzt eine ähnliche Funktion in Logics Scripter gebaut.
var NeedsTimingInfo = true;
var noteCountMin = 1;
var noteCountMax = 12;
var noteDurationMin = 100;
var noteDurationMax = 5000;
var intervalMsMin = 10;
var intervalMsMax = 1000;
function ParameterChanged(param, value) {
switch (param) {
case 0: noteCountMin = Math.floor(value); break; // 1-12
case 1: noteCountMax = Math.floor(value); break; // 1-12
case 2: noteDurationMin = Math.floor(value); break; // 100-5000 ms
case 3: noteDurationMax = Math.floor(value); break; // 100-5000 ms
case 4: intervalMsMin = Math.floor(value); break; // 10-1000 ms
case 5: intervalMsMax = Math.floor(value); break; // 10-1000 ms
}
}
var PluginParameters = [
{name: "Note Count Min", type: "lin", minValue: 1, maxValue: 12, defaultValue: 2, numberOfSteps: 11},
{name: "Note Count Max", type: "lin", minValue: 1, maxValue: 12, defaultValue: 4, numberOfSteps: 11},
{name: "Note Duration Min (ms)", type: "lin", minValue: 100, maxValue: 5000, defaultValue: 1000, numberOfSteps: 49},
{name: "Note Duration Max (ms)", type: "lin", minValue: 100, maxValue: 5000, defaultValue: 1500, numberOfSteps: 49},
{name: "Interval Min (ms)", type: "lin", minValue: 10, maxValue: 1000, defaultValue: 50, numberOfSteps: 99},
{name: "Interval Max (ms)", type: "lin", minValue: 10, maxValue: 1000, defaultValue: 500, numberOfSteps: 99}
];
function HandleMIDI(event) {
if (event instanceof NoteOn) {
var baseNote = event.pitch;
var velocity = event.velocity;
var channel = event.channel;
var noteCount = Math.floor(Math.random() * (noteCountMax - noteCountMin + 1)) + noteCountMin;
var octaveShifts = [-12, 0, 12];
var currentTime = 0;
var firstNoteOn = new NoteOn();
firstNoteOn.pitch = baseNote;
firstNoteOn.velocity = velocity;
firstNoteOn.channel = channel;
firstNoteOn.send();
var firstNoteOff = new NoteOff();
firstNoteOff.pitch = baseNote;
firstNoteOff.velocity = 0;
firstNoteOff.channel = channel;
firstNoteOff.sendAfterMilliseconds(noteDurationMax);
for (var i = 0; i < noteCount; i++) {
var intervalMs = Math.floor(Math.random() * (intervalMsMax - intervalMsMin + 1)) + intervalMsMin;
var noteDuration = Math.floor(Math.random() * (noteDurationMax - noteDurationMin + 1)) + noteDurationMin;
currentTime += intervalMs;
var octaveShift = octaveShifts[Math.floor(Math.random() * octaveShifts.length)];
var newPitch = baseNote + octaveShift;
var panControlValue = Math.floor(Math.random() * 100) + 30;
if (newPitch >= 0 && newPitch <= 127) {
var panControl = new ControlChange();
panControl.number = 10;
panControl.value = panControlValue;
panControl.channel = channel;
panControl.sendAfterMilliseconds(currentTime);
var newNoteOn = new NoteOn();
newNoteOn.pitch = newPitch;
newNoteOn.velocity = Math.max(1, velocity - 40 + Math.floor(Math.random() * 20));
newNoteOn.channel = channel;
newNoteOn.sendAfterMilliseconds(currentTime);
var newNoteOff = new NoteOff();
newNoteOff.pitch = newNoteOn.pitch;
newNoteOff.velocity = 0;
newNoteOff.channel = newNoteOn.channel;
newNoteOff.sendAfterMilliseconds(currentTime + noteDuration);
}
}
event.send = false;
}
}
Code-Sprache: JavaScript (javascript)
Mit diesem Script wird, nachdem eine Note gespielt wurde, ein Pattern, bestehend aus Oktav-Arpeggios, gespielt. Länge des Patterns, Timing, Pan und Velocity sind hierbei (fast) dem Zufall überlassen. Min- und Max-Werte lassen sich festlegen. Wenn ein Klavier als Instrument gewählt ist, klingt das Ergebnis so ähnlich wie in Stratus. Scripter kann jedoch jedes beliebige Instrument triggern.