/* With Scripter, you can use JavaScript to create your own custom MIDI processing effects, including slider controls for real-time interaction. For detailed information about using Scripter, including code samples, see the MIDI plug-ins chapter of the Logic Pro X Effects or MainStage 3 Effects manual. */ /* * @Author: AJ Javadi * @Email: amirjavadi25@gmail.com * @Date: 2023-07-29 11:33:21 * @Last Modified by: * @Last Modified time: 2023-07-29 11:33:21 * @Description: In-scale-script * // example: simple pass through and MIDI monitor // map out the scale degreess for major and minor scales Major Scale Relationship: (W-W-H-W-W-W-H) // major scale // 0 2 4 5 7 9 11 Minor Scale Relationship: (W-H-W-W-H-W-W) // minor scale // 0 2 3 5 7 8 10 // 0 = C // 1 = C# // 2 = D // 3 = D# // 4 = E // 5 = F // 6 = F# // 7 = G // 8 = G# // 9 = A // 10 = A# // 11 = B //12 = H // H# is the same as C but one octave higher */ function HandleMIDI(event) { event.trace(); event.send(); } const majorMinorMap = [ [0, 0, 2, 2, 4, 5, 5, 7, 7, 9, 9, 11], [0, 0, 2, 2, 3, 5, 5, 7, 7, 8, 8, 10], ]; var PluginParameters = [ { name: "Root Note", type: "menu", valueStrings: ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "H", "H#"], defaultValue: 0, }, { name: "Octave Offset", type: "lin", minValue: -2, maxValue: 2, defaultValue: 0, numberOfSteps: 4, }, { name: "Scale Type", type: "menu", valueStrings: ["Major", "Minor"], defaultValue: 0, }, { name: "Fixed Velocity", type: "lin", minValue: 0, maxValue: 127, defaultValue: 0, numberOfSteps: 127, }, { name: "MIDI Channel", type: "lin", minValue: 1, maxValue: 16, defaultValue: 3, numberOfSteps: 15, }, ]; function HandleMIDI(event) { if (event.channel === GetParameter("MIDI Channel") && typeof event.pitch === "number") { const octave = Math.floor(event.pitch / 12); const mappedNote = majorMinorMap[GetParameter("Scale Type")][event.pitch % 12]; event.pitch = mappedNote + (GetParameter("Octave Offset") + octave) * 12 + GetParameter("Root Note"); event.channel = 1; if (GetParameter("Fixed Velocity") > 0) { event.velocity = GetParameter("Fixed Velocity"); } } event.send(); }