diff --git a/MIDI Editor/talagan_OneSmallStep Change note len modifier.lua b/MIDI Editor/talagan_OneSmallStep Change note len modifier.lua new file mode 100644 index 000000000..837b92362 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep Change note len modifier.lua @@ -0,0 +1,19 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path; + +local modifier = select(2, reaper.get_action_context()):match("%- ([^%s]*)%.lua$"); + +local engine_lib = require "talagan_OneSmallStep/talagan_OneSmallStep Engine lib"; + + +if modifier == 'Triplet' then + engine_lib.setNoteLenModifier(engine_lib.NoteLenModifier.Triplet); +elseif modifier == 'Dotted' then + engine_lib.setNoteLenModifier(engine_lib.NoteLenModifier.Dotted); +elseif modifier == 'Straight' then + engine_lib.setNoteLenModifier(engine_lib.NoteLenModifier.Straight); +end \ No newline at end of file diff --git a/MIDI Editor/talagan_OneSmallStep Change note len.lua b/MIDI Editor/talagan_OneSmallStep Change note len.lua new file mode 100644 index 000000000..263f066d6 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep Change note len.lua @@ -0,0 +1,11 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path; + +local note_len = select(2, reaper.get_action_context()):match("%- ([^%s]*)%.lua$"); + +local engine_lib = require "talagan_OneSmallStep/talagan_OneSmallStep Engine lib"; +engine_lib.setNoteLen(note_len); diff --git a/MIDI Editor/talagan_OneSmallStep Cleanup helper JSFXs.lua b/MIDI Editor/talagan_OneSmallStep Cleanup helper JSFXs.lua new file mode 100644 index 000000000..0f4716817 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep Cleanup helper JSFXs.lua @@ -0,0 +1,12 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path; + +local helper_lib = require "talagan_OneSmallStep/talagan_OneSmallStep Helper lib"; + +reaper.Undo_BeginBlock(); +helper_lib.cleanupAllTrackFXs(); +reaper.Undo_EndBlock("One Small Step - Cleanup helper JSFXs",-1); \ No newline at end of file diff --git a/MIDI Editor/talagan_OneSmallStep Commit.lua b/MIDI Editor/talagan_OneSmallStep Commit.lua new file mode 100644 index 000000000..6e2bcd982 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep Commit.lua @@ -0,0 +1,9 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path; + +local engine_lib = require "talagan_OneSmallStep/talagan_OneSmallStep Engine lib"; +engine_lib.reaperActionCommit(); diff --git a/MIDI Editor/talagan_OneSmallStep Decrease note len.lua b/MIDI Editor/talagan_OneSmallStep Decrease note len.lua new file mode 100644 index 000000000..7bd93e9cc --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep Decrease note len.lua @@ -0,0 +1,9 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path; + +local engine_lib = require "talagan_OneSmallStep/talagan_OneSmallStep Engine lib"; +engine_lib.decreaseNoteLen(); diff --git a/MIDI Editor/talagan_OneSmallStep Increase note len.lua b/MIDI Editor/talagan_OneSmallStep Increase note len.lua new file mode 100644 index 000000000..e9d674f04 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep Increase note len.lua @@ -0,0 +1,9 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path; + +local engine_lib = require "talagan_OneSmallStep/talagan_OneSmallStep Engine lib"; +engine_lib.increaseNoteLen(); diff --git a/MIDI Editor/talagan_OneSmallStep.lua b/MIDI Editor/talagan_OneSmallStep.lua new file mode 100644 index 000000000..468c59646 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep.lua @@ -0,0 +1,399 @@ +--[[ +@description One Small Step : Alternative Step Input +@version 0.1 +@author Ben 'Talagan' Babut +@license MIT +@metapackage +@provides + [main=main,midi_editor] . + [main=main,midi_editor] talagan_OneSmallStep Change note len modifier.lua > talagan_OneSmallStep Change note len modifier - Triplet.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len modifier.lua > talagan_OneSmallStep Change note len modifier - Straight.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len modifier.lua > talagan_OneSmallStep Change note len modifier - Dotted.lua + [main=main,midi_editor] talagan_OneSmallStep Increase note len.lua + [main=main,midi_editor] talagan_OneSmallStep Decrease note len.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len.lua > talagan_OneSmallStep Change note len - 1_64.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len.lua > talagan_OneSmallStep Change note len - 1_32.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len.lua > talagan_OneSmallStep Change note len - 1_16.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len.lua > talagan_OneSmallStep Change note len - 1_8.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len.lua > talagan_OneSmallStep Change note len - 1_4.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len.lua > talagan_OneSmallStep Change note len - 1_2.lua + [main=main,midi_editor] talagan_OneSmallStep Change note len.lua > talagan_OneSmallStep Change note len - 1.lua + [main=main,midi_editor] talagan_OneSmallStep Cleanup helper JSFXs.lua + [main=main,midi_editor] talagan_OneSmallStep Commit.lua + [nomain] talagan_OneSmallStep/images/*.lua + [nomain] talagan_OneSmallStep/talagan_OneSmallStep Engine lib.lua + [nomain] talagan_OneSmallStep/talagan_OneSmallStep Helper lib.lua + [effect] talagan_OneSmallStep/One Small Step Helper.jsfx + [data] talagan_OneSmallStep/toolbar_icons/toolbar_one_small_step.png > toolbar_icons/toolbar_one_small_step.png + [data] talagan_OneSmallStep/toolbar_icons/toolbar_one_small_step_cleanup.png > toolbar_icons/toolbar_one_small_step_cleanup.png +@screenshot + https://stash.reaper.fm/48161/One%20Small%20Step%200.1.png +@changelog + Initial version. +@about + # Purpose + + One Small Step is a tool for performing MIDI note step input in REAPER. It is an alternative to the standard step input, and it tries to address some issues with certain workflows, as well as to propose different input modes, like validating held notes with the sustain pedal or a REAPER action (obviously linked to a custom keyboard shortcut). It will also work outside of the MIDI editor (in the arrange view), as long as you've selected a MIDI item and set the cursor at the right position ; this offers additional comfort and can speed up your workflow. + + # More detail + + REAPER's step input tool uses the MIDI control path. While it has some advantages, one of the main issue you may have encountered is that when step inputing, MIDI events will not go through the input FX chain of the track you're working on. If you are performing MIDI processing there (like channel routing, note transposition, note dropping, velocity processing, etc), everything will be ignored because REAPER does not use the result of the FX input chain, but the raw MIDI note events. This leads to strange behaviours, e.g. the MIDI editor piano roll not being in coherency with the input notes (so what you see on the piano roll is not what you'll get), but worse, you will not get the same result as if you were recording. + + To address this, One Small Step installs a JSFX at the end of the track input chain to watch for note events AFTER they've been processed by the FX input chain, and performs the patching of the MIDI item by itself. + + # Install Notes + + This script also needs the JS_ReaScriptAPI api by Julian Sander and the ReaImGui library by Christian Fillion to work. Please install them alongside (OSS will remind you to do so anyway). + + # Reaper forum thread + + The forum thread does not exist yet (at release time). Please search "One Small Step" on reaper forums for now (until a new version is released and the doc is updated). + + # How to use + + Launch the action called 'OneSmallStep' (other actions are provided but we'll get on this later). You should now see OSS's main dialog - One Small Step is active (it is active as long as this dialog is visible). At the top of it, the name of the target MIDI track / item / take will be displayed if there's one eligible that matches your current selection. It is important to note that the track should be armed for record (OSS will give you an indication if you forgot to arm the recording). If everyhing's ready, a red circle will glow, meaning that in this configuration, OneSmallStep is able to do its job (listen to MIDI events, and step input/patch the current MIDI item). + + ## Input modes + + You can then select your input mode between Off / Keyboard / Sustain Pedal / Action. + + ### Off mode + + Does nothing. It just allows to keep the window open and play with the params without the risk to edit something. + + ### Keyboard + + Notes are added to the MIDI item at the current position, when the keys are released. + + ### Sustain Pedal + + Hold keys on your MIDI controller, then press the sustain pedal to validate them. This is convenient when playing with chords for example. + + ### Action + + It's the same thing as with the sustain pedal, except that held notes are validated with a REAPER action. This action is the one called 'OneSmallStep Commit'. You can assign a shortcut to it, and your shortcut will take the role of the sustain pedal for validation. + + ## Note length + + You can adjust the length of the input notes here. + + ## Other actions + + To speed up your flow, multiple actions are provided to quickly change OSS parameters, so that you can assign shortcuts to them. Those are the "Change note len", "Decrease/Increase note len", "Toggle note len modifier" actions, whose names should be safe explanatory. The "Cleanup helper JSFXs" is here for cleaniness, to remove the Helper JSFXs that are installed automatically on the input FX chain of your tracks when OSS is running (it could have been done automatically when closing the tool, but it adds an entry in the undo stack, which is annoying, and I don't have a solution for this yet). + + # Toolbar icons + + Two toolbar icons are provided with OSS, one icon for launching OSS ('toolbar_one_small_step'), and one for launching the cleanup script ('toolbar_one_small_step_cleanup'). + + # Credits + + This tool takes a lot of inspiration in tenfour's "tenfour-step" scripts. Epic hail to tenfour for opening the way ! + +--]] + +-------------------------------- + +--[[ +# Ruby script to convert from png > lua to load binary img for ReaImGui + +def png_to_lua(fname) + buf = File.open(fname,"rb").read.unpack("C*").map{ |c| "\\x%02X" % c }.each_slice(40).map{ |s| s.join }.join("\\z\n") + buf = "return \"\\z\n" + buf + "\"\n;\n" + outname = File.basename(fname,".png") + ".lua" + File.open(outname, "wb") { |f| f << buf } +end + +png_to_lua("triplet.png") + +--]] + +------------------------------- +-- Path and modules + +package.path = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]] .."?.lua;".. package.path +local engine_lib = require "talagan_OneSmallStep/talagan_OneSmallStep Engine lib"; + +------------------------------- +-- Check dependencies + +if not reaper.APIExists("JS_ReaScriptAPI_Version") then + local answer = reaper.MB( "You have to install JS_ReaScriptAPI for this script to work. Right-click the entry in the next window and choose to install.", "JS_ReaScriptAPI not installed", 0 ) + reaper.ReaPack_BrowsePackages( "js_ReaScriptAPI" ) + return +end + +if not reaper.APIExists("ImGui_CreateContext") then + local answer = reaper.MB( "You have to install ReaImGui for this script to work. Right-click the entry in the next window and choose to install.", "ReaImGUI not installed", 0 ) + reaper.ReaPack_BrowsePackages( "ReaImGui:" ) + return +end + +------------------------------- +-- ImGui Backward compatibility + +dofile(reaper.GetResourcePath() .. '/Scripts/ReaTeam Extensions/API/imgui.lua')('0.8.7') + +------------------------------- + +local images = {}; + +function getImage(image_name) + if not reaper.ImGui_ValidatePtr(images[image_name], 'ImGui_Image*') then + local bin = require("./talagan_OneSmallStep/images/" .. image_name); + images[image_name] = reaper.ImGui_CreateImageFromMem(bin); + end + return images[image_name]; +end + +------------------------------- + +local ctx = reaper.ImGui_CreateContext('One Small Step'); +local bigfont = reaper.ImGui_CreateFont("sans-serif", 16); +local bigfontbold = reaper.ImGui_CreateFont("sans-serif", 16, reaper.ImGui_FontFlags_Bold()); + +reaper.ImGui_Attach(ctx,bigfont); +reaper.ImGui_Attach(ctx,bigfontbold); + +------------------------------ + +_DEBUG=true +function DBG(txt) + if _DEBUG then + reaper.ShowConsoleMsg(txt); + end +end + +------- + +function ButtonGroupTextButton(text, is_on, callback) + reaper.ImGui_SetCursorPosY(ctx,reaper.ImGui_GetCursorPosY(ctx) - 2); + reaper.ImGui_PushStyleColor(ctx, reaper.ImGui_Col_Button(), is_on and 0x5080FFFF or 0x203040FF); + if reaper.ImGui_Button(ctx, text) then + callback(); + end + + reaper.ImGui_PopStyleColor(ctx); + reaper.ImGui_SameLine(ctx); +end + +function ButtonGroupImageButton(image_name, is_on, callback) + reaper.ImGui_SetCursorPosY(ctx,reaper.ImGui_GetCursorPosY(ctx) - 3); + reaper.ImGui_PushStyleColor(ctx, reaper.ImGui_Col_Button(), is_on and 0x5080FFFF or 0x203040FF); + + if reaper.ImGui_ImageButton(ctx, image_name, getImage(image_name), 20, 20, 0.1, 0.1, 0.9, 0.9, 0, 0xFFFFFFFF) then + callback(); + end + + reaper.ImGui_PopStyleColor(ctx); + reaper.ImGui_SameLine(ctx); +end + +function ImGui_VerticalSpacer(context, height) + reaper.ImGui_PushStyleVar(context, reaper.ImGui_StyleVar_ItemSpacing(),0,0) + reaper.ImGui_Dummy(context, 10, height); + reaper.ImGui_PopStyleVar(context,1); +end + +function ui_loop() + reaper.ImGui_PushStyleVar(ctx,reaper.ImGui_StyleVar_WindowPadding(),10,10); + + -- + local flags = reaper.ImGui_WindowFlags_NoDocking() | + reaper.ImGui_WindowFlags_NoCollapse() | + reaper.ImGui_WindowFlags_AlwaysAutoResize() | + reaper.ImGui_WindowFlags_TopMost(); + + -- Since we use a trick to give back the focus to reaper, we don't want the window to glitch. + reaper.ImGui_PushStyleColor(ctx, reaper.ImGui_Col_TitleBgActive(), 0x0A0A0AFF); + local visible, open = reaper.ImGui_Begin(ctx, 'One Small Step v0.1', true, flags); + reaper.ImGui_PopStyleColor(ctx,1); + + if visible then + reaper.ImGui_SetConfigVar(ctx,reaper.ImGui_ConfigVar_HoverDelayNormal(), 1.0); + + -- Target display line + local take = engine_lib.TakeForEdition(); + if not take then + reaper.ImGui_TextColored(ctx, 0xA0A0A0FF, "No target item. Please select one."); + + ImGui_VerticalSpacer(ctx,3); + else + local track = reaper.GetMediaItemTake_Track(take); + local _, track_name = reaper.GetTrackName(track); + local take_name = reaper.GetTakeName(take); + local recarmed = reaper.GetMediaTrackInfo_Value(track, "I_RECARM"); + local playState = reaper.GetPlayState(); + + reaper.ImGui_TextColored(ctx, 0xA0A0FFFF, track_name .. " / " .. take_name) + + -- Glowing indicator + reaper.ImGui_SameLine(ctx); + reaper.ImGui_SetCursorPosY(ctx, reaper.ImGui_GetCursorPosY(ctx) - 3); + + if (recarmed == 1) and not (engine_lib.getMode() == 0) and playState == 0 then + local alpha = math.sin(reaper.time_precise()*4); + local r1 = 200+math.floor(55 * alpha); + local r2 = 120+math.floor(55 * alpha); + + reaper.ImGui_PushStyleColor(ctx, reaper.ImGui_Col_CheckMark(), (r1 << 24) | 0x000000FF); + reaper.ImGui_PushStyleColor(ctx, reaper.ImGui_Col_FrameBg(), (r2 << 24) | 0x000000FF); + else + reaper.ImGui_PushStyleColor(ctx, reaper.ImGui_Col_CheckMark(), 0xCCCCCCFF); + reaper.ImGui_PushStyleColor(ctx, reaper.ImGui_Col_FrameBg(), 0x808080FF); + end + + reaper.ImGui_RadioButton(ctx, '##', true); + reaper.ImGui_PopStyleColor(ctx, 2); + + -- Target issues debug text + reaper.ImGui_SameLine(ctx); + reaper.ImGui_SetCursorPosY(ctx, reaper.ImGui_GetCursorPosY(ctx) - 3); + if not (recarmed == 1) then + reaper.ImGui_TextColored(ctx, 0x808080FF, '[Track not armed]'); + elseif engine_lib.getMode() == 0 then + reaper.ImGui_TextColored(ctx, 0x808080FF, '[Input Mode is OFF]'); + elseif not (playState == 0) then + reaper.ImGui_TextColored(ctx, 0x808080FF, '[Reaper not ready]'); + else + reaper.ImGui_TextColored(ctx, 0x808080FF, ''); + end + + end + + -- Separator + ImGui_VerticalSpacer(ctx,10); + + -- Input mode line + reaper.ImGui_PushStyleVar(ctx, reaper.ImGui_StyleVar_ItemSpacing(),10,3); + reaper.ImGui_Text(ctx, "Input Mode"); + reaper.ImGui_SameLine(ctx); + reaper.ImGui_PushStyleVar(ctx, reaper.ImGui_StyleVar_ItemSpacing(),2,3); + + local mode = engine_lib.getMode(); + + ButtonGroupTextButton("Off", mode == engine_lib.InputMode.None, function() engine_lib.setMode(engine_lib.InputMode.None); end); + if reaper.ImGui_IsItemHovered(ctx, reaper.ImGui_HoveredFlags_DelayNormal() ) then + reaper.ImGui_SetTooltip(ctx, 'One Small Step input is disabled.\n\nThat mode allows you to keep\nthis window open, but that\'s all.') + end + + ButtonGroupTextButton("Keyboard", mode == engine_lib.InputMode.Keyboard, function() engine_lib.setMode(engine_lib.InputMode.Keyboard); end); + if reaper.ImGui_IsItemHovered(ctx, reaper.ImGui_HoveredFlags_DelayNormal() ) then + reaper.ImGui_SetTooltip(ctx, 'Notes are added on keyboard key\nrelease events.\n\nThis is pretty much the same as\nReaper\'s default step input mode.') + end + + ButtonGroupTextButton("Pedal", mode == engine_lib.InputMode.Pedal, function() engine_lib.setMode(engine_lib.InputMode.Pedal); end); + if reaper.ImGui_IsItemHovered(ctx, reaper.ImGui_HoveredFlags_DelayNormal()) then + reaper.ImGui_SetTooltip(ctx, 'Hold some keyboard keys, and\nthen press the sustain pedal\nto validate and add notes.\n\nUseful when testing chords.') + end + + ButtonGroupTextButton("Action", mode == engine_lib.InputMode.Action, function() engine_lib.setMode(engine_lib.InputMode.Action); end); + if reaper.ImGui_IsItemHovered(ctx, reaper.ImGui_HoveredFlags_DelayNormal()) then + reaper.ImGui_SetTooltip(ctx, 'Hold some keyboard keys, and then\ncall the \'OneSmallStep Commit\'\naction from Reaper to validate\nand add notes.\n\nThis is pretty much the same as\nthe sustain pedal mode, except\nthat it uses a Reaper action\nto validate input notes.') + end + + reaper.ImGui_PopStyleVar(ctx,2); + + -- Separator + reaper.ImGui_NewLine(ctx); + ImGui_VerticalSpacer(ctx,5); + + -- Note length line + reaper.ImGui_Text(ctx, "Note Length"); + reaper.ImGui_SameLine(ctx); + reaper.ImGui_PushStyleVar(ctx, reaper.ImGui_StyleVar_FramePadding(), 0, 0); + reaper.ImGui_PushStyleVar(ctx, reaper.ImGui_StyleVar_ItemSpacing(), 2, 4); + reaper.ImGui_PushStyleVar(ctx, reaper.ImGui_StyleVar_ItemInnerSpacing(), 0, 0); + + local nl = engine_lib.getNoteLen(); + for s,k in ipairs({ "1", "1_2", "1_4", "1_8", "1_16", "1_32", "1_64" }) do + ButtonGroupImageButton('note_'.. k, nl==k, + function() + engine_lib.setNoteLen(k) + end + ); + end + + reaper.ImGui_SameLine(ctx); + reaper.ImGui_Dummy(ctx,10,0); + reaper.ImGui_SameLine(ctx); + + local nmod = engine_lib.getNoteLenModifier(); + + ButtonGroupImageButton('note_dotted', nmod == engine_lib.NoteLenModifier.Dotted, function() + if nmod == engine_lib.NoteLenModifier.Dotted then + engine_lib.setNoteLenModifier(engine_lib.NoteLenModifier.Streight); + else + engine_lib.setNoteLenModifier(engine_lib.NoteLenModifier.Dotted); + end + end + ); + ButtonGroupImageButton('note_triplet', nmod == engine_lib.NoteLenModifier.Triplet, function() + if nmod == engine_lib.NoteLenModifier.Triplet then + engine_lib.setNoteLenModifier(engine_lib.NoteLenModifier.Streight); + else + engine_lib.setNoteLenModifier(engine_lib.NoteLenModifier.Triplet); + end + end + ); + + reaper.ImGui_PopStyleVar(ctx,3); + + if reaper.ImGui_IsWindowFocused(ctx) then + if not focustimer or reaper.ImGui_IsAnyMouseDown(ctx) then + -- create or reset the timer when there's activity in the window + focustimer = reaper.time_precise(); + end + + if reaper.time_precise() - focustimer > 0.5 then + local hwnd = reaper.GetMainHwnd(); + reaper.JS_Window_SetFocus(hwnd) + end + else + focustimer = nil; + end + + -- End + reaper.ImGui_End(ctx); + + end + + reaper.ImGui_PopStyleVar(ctx); + + if open then + reaper.defer(loop) + else + stop(); + end +end + + +function updateToolbarButtonState(v) + local _,_,sectionID,cmdID,_,_,_ = reaper.get_action_context(); + reaper.SetToggleCommandState(sectionID,cmdID,v); + reaper.RefreshToolbar2(sectionID, cmdID); +end + +function loop() + local engine_ret = engine_lib.atLoop(); + + if engine_ret == -42 then + reaper.ShowMessageBox("Could not install One Small Step's helper FX on the track.\n\nIf you just installed One Small Step, please try to restart REAPER to let it refresh its JFSX repository.", "Oops !", 0); + return; + end + + ui_loop(); +end + +function stop() + updateToolbarButtonState(0); + reaper.ImGui_DestroyContext(ctx); + engine_lib.atExit(); +end + +function start() + updateToolbarButtonState(1); + engine_lib.atStart(); + reaper.defer(loop); +end + +start(); diff --git a/MIDI Editor/talagan_OneSmallStep/One Small Step Helper.jsfx b/MIDI Editor/talagan_OneSmallStep/One Small Step Helper.jsfx new file mode 100644 index 000000000..d0d8fba47 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/One Small Step Helper.jsfx @@ -0,0 +1,143 @@ +noindex: true +desc: One Small Step Helper +version: 0.1 +author: Ben 'Talagan' Babut + +slider1:0<0,3153600000,0.001>Sustain Pedal Activity +slider2:0<0,127,1>Notes in buffer + +// Generate sliders for held notes +Note %d Pitch\n", note_slider_offset + 3*ni + 0, ni); + printf("slider%d:<0,15,1> Note %d Channel\n", note_slider_offset + 3*ni + 1, ni); + printf("slider%d:<0,127,1>Note %d Velocity\n", note_slider_offset + 3*ni + 2, ni); + + ni += 1; + ); +?> + +@init + +last_slider_update = 0; + +// Use a buffer to retain note states, and update sliders in @block +// Instead of updating sliders directly. +// This avoid glitches due to undo operations that could restore FX params +// And we don't want that + +MAX_NOTE = 32; +note_buf = 0; +note_cnt = 0; + +function spitch(note_num) ( (10 + 3*note_num + 0) ); +function schan(note_num) ( (10 + 3*note_num + 1) ); +function svel(note_num) ( (10 + 3*note_num + 2) ); + +// Only note_buf is used so free the memory after it. +freembuf(32 * 3 + 1); + +function addRemoveNoteFromBuffer(m1,m2,m3) + local(s,c,n,v,t,i,j,init_buflen) +( + init_buflen = note_cnt; + + s = m1&$xF0; + n = m2; // note + c = m1&$xF; // channel + v = m3; // velocity + + i = -1; + while // look for this note|channel already in the buffer + ( + i = i+1; + i < note_cnt && i < MAX_NOTE && (notebuf[3*i]|0 != n || notebuf[3*i + 1]|0 != c); + ); + + (i == MAX_NOTE)?( + -1; + ):( + + (s == $x90 && v > 0) ? + ( + + // note-on, add to buffer + notebuf[3*i+0] = n; + notebuf[3*i+1] = c; + notebuf[3*i+2] = v; + + i == note_cnt ? note_cnt = note_cnt+1; + ): + ( + + // note-off, remove from buffer + i < note_cnt ? + ( + j = i; + while(j < note_cnt) + ( + // Shift all sliders to delete current entry + notebuf[3*j+0] = notebuf[3*(j+1)+0]; + notebuf[3*j+1] = notebuf[3*(j+1)+1]; + notebuf[3*j+2] = notebuf[3*(j+1)+2]; + j = j + 1; + ); + while(j < MAX_NOTE) + ( + notebuf[3*j+0] = 0; + notebuf[3*j+1] = 0; + notebuf[3*j+2] = 0; + j = j + 1; + ); + + note_cnt = note_cnt - 1; + ); + ); + ); + + note_cnt==init_buflen ? -1; //return value for nothing added/removed +); + +@block + +function updateSliders() ( + i = 0; + while(i < MAX_NOTE) ( + slider(spitch(i)) = note_buf[3*i+0]; + slider(schan(i)) = note_buf[3*i+1]; + slider(svel(i)) = note_buf[3*i+2]; + i = i+1; + ); + slider2 = note_cnt; +); + +function main() + local(offset,msg1,msg2,msg3) +( + while (midirecv(offset,msg1,msg2,msg3)) + ( + (msg1&$xF0==$x90) ? + addRemoveNoteFromBuffer(msg1,msg2,msg3); + + (msg1&$xF0==$x80) ? + addRemoveNoteFromBuffer(msg1,msg2,msg3); + + (msg1&$xF0==$xB0 && msg2 == 64 && msg3 > 0) ? + slider1 = time_precise(); + + (msg1&$xF0==$xB0 && msg2 == 64 && msg3 == 0) ? + slider1 = 0; + + midisend(offset,msg1,msg2,msg3); + ) +); + +main(); +t = time_precise(); +(t - last_slider_update > 0.05)?( + updateSliders(); + last_slider_update = t; +); diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_1.lua b/MIDI Editor/talagan_OneSmallStep/images/note_1.lua new file mode 100644 index 000000000..9a2ba8766 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_1.lua @@ -0,0 +1,55 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x06\xA1\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x30\x2D\x63\x30\x30\x31\x20\x37\x39\x2E\x31\x34\x65\x63\x62\x34\x32\x66\x32\x63\x2C\x20\x32\x30\x32\x33\x2F\x30\x31\x2F\x31\x33\x2D\x31\x32\x3A\x32\x35\x3A\x34\z +\x34\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\z +\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\z +\x64\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\z +\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\z +\x61\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\z +\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\z +\x72\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\z +\x6F\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x33\x2D\x31\x32\x2D\x30\x36\x54\x31\x37\x3A\x30\x34\x3A\x30\z +\x35\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\x34\z +\x33\x3A\x30\x34\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\z +\x54\x31\x36\x3A\x34\x33\x3A\x30\x34\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\z +\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x33\x30\x65\x32\x39\x36\x34\x61\x2D\x32\x31\x33\x38\x2D\x34\x38\x66\x62\x2D\x61\x65\x32\x34\x2D\x63\x33\x30\x32\x65\x63\x62\z +\x61\x66\x38\x35\x30\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x61\x64\x6F\x62\x65\x3A\x64\x6F\x63\x69\x64\x3A\x70\x68\x6F\z +\x74\x6F\x73\x68\x6F\x70\x3A\x32\x32\x34\x31\x39\x64\x37\x35\x2D\x37\x35\x31\x35\x2D\x31\x63\x34\x63\x2D\x61\x32\x34\x35\x2D\x38\x64\x33\x63\x32\x63\x36\x35\x35\z +\x31\x65\x64\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\x67\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x32\z +\x35\x61\x34\x61\x62\x32\x37\x2D\x39\x35\x66\x36\x2D\x34\x36\x39\x61\x2D\x61\x35\x62\x66\x2D\x39\x66\x34\x64\x38\x31\x65\x31\x66\x63\x32\x38\x22\x3E\x20\x3C\x78\z +\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\z +\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\z +\x3A\x32\x35\x61\x34\x61\x62\x32\x37\x2D\x39\x35\x66\x36\x2D\x34\x36\x39\x61\x2D\x61\x35\x62\x66\x2D\x39\x66\x34\x64\x38\x31\x65\x31\x66\x63\x32\x38\x22\x20\x73\z +\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\x33\x2D\x31\x32\x2D\x30\x36\x54\x31\x37\x3A\x30\x34\x3A\x30\x35\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\z +\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\z +\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x73\x61\x76\z +\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x35\x63\x35\x35\x31\x64\x38\x63\x2D\x34\z +\x39\x66\x38\x2D\x34\x30\x30\x64\x2D\x62\x64\x32\x63\x2D\x61\x65\x39\x63\x39\x64\x33\x33\x64\x65\x62\x65\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\z +\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x32\x3A\x34\x36\x3A\x35\x35\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\z +\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\z +\x22\x20\x73\x74\x45\x76\x74\x3A\x63\x68\x61\x6E\x67\x65\x64\x3D\x22\x2F\x22\x2F\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\z +\x6F\x6E\x3D\x22\x73\x61\x76\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x33\x30\x65\z +\x32\x39\x36\x34\x61\x2D\x32\x31\x33\x38\x2D\x34\x38\x66\x62\x2D\x61\x65\x32\x34\x2D\x63\x33\x30\x32\x65\x63\x62\x61\x66\x38\x35\x30\x22\x20\x73\x74\x45\x76\x74\z +\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\x34\x33\x3A\x30\x34\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\z +\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\z +\x69\x6E\x74\x6F\x73\x68\x29\x22\x20\x73\x74\x45\x76\x74\x3A\x63\x68\x61\x6E\x67\x65\x64\x3D\x22\x2F\x22\x2F\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\z +\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\z +\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\x30\z +\xBF\x9D\x5A\x00\x00\x00\x84\x49\x44\x41\x54\x48\x89\xED\xD6\x41\x0D\x84\x30\x10\x05\xD0\x5F\xB2\x67\x08\x8E\x58\x07\x20\x05\x05\x48\x40\x0A\x16\x70\x80\x84\x5D\z +\x07\x0C\xFD\x02\xCA\x65\x04\x30\x84\x84\xCB\xFF\x97\x69\x9A\xB6\x6F\xDA\x53\x53\x29\x05\x6F\xA4\x7A\x45\x15\x2C\x58\xB0\x60\xC1\x82\x05\x0B\xBE\x1C\x23\x7B\x23\z +\x7F\x46\x6E\x46\xCE\x46\x16\x1F\xF7\x51\xF8\x13\x5C\xBF\x78\xFD\xB6\x75\xBD\xEE\x39\x1F\x00\x26\x9F\x4F\x91\x83\xEE\x3E\x75\xE7\x75\xBD\xB9\x3F\x7C\xE3\x01\xC0\z +\x0C\x60\xDA\x73\x6E\xBC\x81\x3F\x80\x31\x0A\x27\x7D\x6F\x05\x0B\x7E\x2A\x27\x25\xD2\x2C\x60\x73\x66\x31\xC3\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_1_16.lua b/MIDI Editor/talagan_OneSmallStep/images/note_1_16.lua new file mode 100644 index 000000000..a9978c66c --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_1_16.lua @@ -0,0 +1,53 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x05\xC4\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x30\x2D\x63\x30\x30\x31\x20\x37\x39\x2E\x31\x34\x65\x63\x62\x34\x32\x66\x32\x63\x2C\x20\x32\x30\x32\x33\x2F\x30\x31\x2F\x31\x33\x2D\x31\x32\x3A\x32\x35\x3A\x34\z +\x34\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\z +\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\z +\x64\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\z +\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\z +\x61\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\z +\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\z +\x72\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\z +\x6F\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x31\x39\x38\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\z +\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\x34\z +\x33\x3A\x33\x36\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\z +\x54\x31\x36\x3A\x34\x33\x3A\x33\x36\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\z +\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x33\x63\x39\x30\x38\x34\x63\x30\x2D\x32\x37\x36\x33\x2D\x34\x36\x32\x31\x2D\x61\x36\x31\x66\x2D\x63\x32\x35\x62\x39\x37\x34\z +\x62\x34\x38\x61\x30\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x34\x30\x37\x61\x34\x36\x38\z +\x32\x2D\x63\x61\x64\x31\x2D\x34\x65\x61\x37\x2D\x38\x61\x35\x35\x2D\x33\x36\x62\x33\x39\x64\x62\x64\x31\x30\x61\x30\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\z +\x67\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x34\x30\x37\x61\x34\x36\x38\x32\x2D\x63\x61\x64\x31\x2D\x34\z +\x65\x61\x37\x2D\x38\x61\x35\x35\x2D\x33\x36\x62\x33\x39\x64\x62\x64\x31\x30\x61\x30\x22\x3E\x20\x3C\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\z +\x3C\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\z +\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x34\x30\x37\x61\x34\x36\x38\x32\x2D\x63\x61\x64\x31\z +\x2D\x34\x65\x61\x37\x2D\x38\x61\x35\x35\x2D\x33\x36\x62\x33\x39\x64\x62\x64\x31\x30\x61\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x31\x39\x38\z +\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\z +\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\z +\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x73\x61\x76\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\z +\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x33\x63\x39\x30\x38\x34\x63\x30\x2D\x32\x37\x36\x33\x2D\x34\x36\x32\x31\x2D\x61\x36\x31\x66\x2D\z +\x63\x32\x35\x62\x39\x37\x34\x62\x34\x38\x61\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\z +\x34\x33\x3A\x33\x36\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\z +\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x20\x73\x74\x45\x76\x74\x3A\x63\x68\x61\x6E\x67\x65\z +\x64\x3D\x22\x2F\x22\x2F\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\z +\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\z +\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\x98\x0E\xBD\x2C\x00\x00\x00\xF4\x49\x44\x41\x54\x48\x89\xED\xD6\xD1\x0D\x82\x30\x14\x85\z +\xE1\xBF\xC6\xE7\x46\x26\x90\x11\x70\x03\x9D\xC0\x38\x02\x1B\xE8\x24\xB8\x81\x23\xA8\x13\xB8\x82\x23\xB8\x41\xEB\x65\x00\x7C\x80\x44\x45\x48\x4A\xC1\xEA\x03\x27\z +\x21\x21\x0D\x97\x8F\x96\x16\xAA\x8A\xA2\xE0\x17\x99\xFC\x44\x1D\xE1\x11\x7E\x8D\x52\xEA\xE3\xB0\x79\x7E\xA9\xB7\x0D\x0E\xB7\x64\x69\x44\x12\x9F\xC2\x21\x86\xFA\z +\xE2\x83\xF7\x85\x6F\x80\xF5\xC1\xFB\xC2\x31\xB0\x02\x4E\xC0\xD1\x88\xCC\x42\xC1\x00\x87\x48\xEB\x14\xB8\x02\xDB\x90\xF0\xD2\x88\x1C\x80\x14\x58\xBB\x16\x4D\x07\z +\x80\xF7\x3C\x7B\x6A\x5D\x8B\x7A\xF7\x38\xD2\x7A\x07\x2C\x80\x04\x98\x05\x83\x2B\xFC\x4A\x39\xC9\xC2\xC2\x15\x6E\x29\x67\x77\x58\xB8\xCA\xDD\xF5\xC2\xCE\x93\xCB\z +\x88\xC4\x94\xEB\xB7\x29\xF3\xAF\xC0\x46\x24\xA3\x65\xAD\x56\x0F\x64\x5D\xEF\xA5\x5C\xF7\x5C\x36\xCF\xB7\x40\x56\x6F\x8F\xB4\x7E\xFB\x25\xB9\xDE\xAF\xCB\x3B\x6E\z +\xFA\x38\x6C\x3A\xD4\x7B\xC3\xE7\x97\xF3\x1B\x90\x46\x5A\x9F\x7C\x61\xE7\xA1\x1E\x3A\xFF\xBF\xF5\x19\xE1\x11\xEE\x9A\x07\x57\x89\x41\x51\x9D\xA4\x3D\x82\x00\x00\z +\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_1_2.lua b/MIDI Editor/talagan_OneSmallStep/images/note_1_2.lua new file mode 100644 index 000000000..30dacc66c --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_1_2.lua @@ -0,0 +1,45 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x04\xF5\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x30\x2D\x63\x30\x30\x31\x20\x37\x39\x2E\x31\x34\x65\x63\x62\x34\x32\x66\x32\x63\x2C\x20\x32\x30\x32\x33\x2F\x30\x31\x2F\x31\x33\x2D\x31\x32\x3A\x32\x35\x3A\x34\z +\x34\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\z +\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\z +\x64\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\z +\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\z +\x61\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\z +\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\z +\x72\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\z +\x6F\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x32\x3A\x35\x30\x3A\x34\z +\x34\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\x34\z +\x33\x3A\x31\x33\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\z +\x54\x31\x36\x3A\x34\x33\x3A\x31\x33\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\z +\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x66\x31\x65\x38\x38\x30\x30\x64\x2D\x33\x65\x39\x33\x2D\x34\x63\x61\x31\x2D\x39\x62\x32\x63\x2D\x31\x66\x33\x61\x65\x39\x39\z +\x65\x62\x62\x34\x30\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x66\x31\x65\x38\x38\x30\x30\z +\x64\x2D\x33\x65\x39\x33\x2D\x34\x63\x61\x31\x2D\x39\x62\x32\x63\x2D\x31\x66\x33\x61\x65\x39\x39\x65\x62\x62\x34\x30\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\z +\x67\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x66\x31\x65\x38\x38\x30\x30\x64\x2D\x33\x65\x39\x33\x2D\x34\z +\x63\x61\x31\x2D\x39\x62\x32\x63\x2D\x31\x66\x33\x61\x65\x39\x39\x65\x62\x62\x34\x30\x22\x3E\x20\x3C\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\z +\x3C\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\z +\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x66\x31\x65\x38\x38\x30\x30\x64\x2D\x33\x65\x39\x33\z +\x2D\x34\x63\x61\x31\x2D\x39\x62\x32\x63\x2D\x31\x66\x33\x61\x65\x39\x39\x65\x62\x62\x34\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\z +\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x32\x3A\x35\x30\x3A\x34\x34\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\z +\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\z +\x20\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x44\x65\x73\x63\x72\z +\x69\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\x3F\x78\x70\x61\x63\x6B\x65\z +\x74\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\x73\x0F\x8F\xDC\x00\x00\x00\x9E\x49\x44\x41\x54\x48\x89\xED\xD6\xB1\x0D\xC2\x30\x14\x45\xD1\x6B\x44\x6D\x91\x0D\x18\z +\x01\x36\x80\x09\x08\x1B\x64\x04\x18\x85\x09\x18\x81\x11\x60\x03\xD8\xE4\x47\x2F\x03\x7C\x2A\x1A\x10\x12\x31\x84\x34\xFF\x4A\xAF\xB4\x8F\xE4\xCA\xC9\xDD\x19\xA3\z +\xC9\x28\x6A\xC0\x01\x3F\x97\x52\x7A\x59\xDB\x75\xE7\xC1\xE1\x37\xAD\xC6\x82\x8B\x0A\x38\xE0\x80\x03\x2E\x6E\x5A\x72\xC8\xA4\x05\x30\xFB\x2B\x6C\xD2\x11\x68\x80\z +\xCB\x37\x78\xAF\xA7\x36\x69\x07\xD4\xC0\xB2\xCA\x79\x0D\x6C\x81\x76\x70\x18\xD8\x00\x87\x2A\xE7\x9B\x49\x73\xE0\x04\xEC\x4B\x60\xDC\xFD\xE3\x99\x54\x9B\xE4\x26\z +\x5D\x4D\x32\x93\x9A\xBE\x77\x3C\x96\xE2\x7B\x1B\x70\xC0\xBF\xEA\x0E\x47\xAC\x76\x77\x8F\xB8\x36\x09\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_1_32.lua b/MIDI Editor/talagan_OneSmallStep/images/note_1_32.lua new file mode 100644 index 000000000..228644f3a --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_1_32.lua @@ -0,0 +1,53 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x05\xC4\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x30\x2D\x63\x30\x30\x31\x20\x37\x39\x2E\x31\x34\x65\x63\x62\x34\x32\x66\x32\x63\x2C\x20\x32\x30\x32\x33\x2F\x30\x31\x2F\x31\x33\x2D\x31\x32\x3A\x32\x35\x3A\x34\z +\x34\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\z +\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\z +\x64\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\z +\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\z +\x61\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\z +\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\z +\x72\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\z +\x6F\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x31\x39\x38\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\z +\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\x34\z +\x33\x3A\x32\x39\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\z +\x54\x31\x36\x3A\x34\x33\x3A\x32\x39\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\z +\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x62\x37\x35\x64\x62\x39\x64\x64\x2D\x62\x39\x37\x63\x2D\x34\x66\x61\x31\x2D\x62\x36\x63\x31\x2D\x33\x61\x62\x65\x35\x65\x62\z +\x35\x32\x36\x30\x39\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x38\x63\x35\x36\x37\x38\x37\z +\x62\x2D\x30\x38\x33\x34\x2D\x34\x34\x30\x62\x2D\x38\x64\x36\x32\x2D\x33\x33\x62\x62\x64\x30\x39\x33\x31\x36\x36\x31\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\z +\x67\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x38\x63\x35\x36\x37\x38\x37\x62\x2D\x30\x38\x33\x34\x2D\x34\z +\x34\x30\x62\x2D\x38\x64\x36\x32\x2D\x33\x33\x62\x62\x64\x30\x39\x33\x31\x36\x36\x31\x22\x3E\x20\x3C\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\z +\x3C\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\z +\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x38\x63\x35\x36\x37\x38\x37\x62\x2D\x30\x38\x33\x34\z +\x2D\x34\x34\x30\x62\x2D\x38\x64\x36\x32\x2D\x33\x33\x62\x62\x64\x30\x39\x33\x31\x36\x36\x31\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x31\x39\x38\z +\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\z +\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\z +\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x73\x61\x76\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\z +\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x62\x37\x35\x64\x62\x39\x64\x64\x2D\x62\x39\x37\x63\x2D\x34\x66\x61\x31\x2D\x62\x36\x63\x31\x2D\z +\x33\x61\x62\x65\x35\x65\x62\x35\x32\x36\x30\x39\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\z +\x34\x33\x3A\x32\x39\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\z +\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x20\x73\x74\x45\x76\x74\x3A\x63\x68\x61\x6E\x67\x65\z +\x64\x3D\x22\x2F\x22\x2F\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\z +\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\z +\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\xA3\x97\xE2\xBF\x00\x00\x00\xEC\x49\x44\x41\x54\x48\x89\xED\xD6\xD1\x09\xC2\x30\x14\x85\z +\xE1\x3F\xE2\x73\xB0\x1B\x74\x03\x57\xA8\x1B\xE8\x04\xEA\x06\x76\x02\x71\x82\x8E\xA0\x1B\xE8\x06\x3A\x42\xDD\xC0\x0D\x52\x6E\x07\xA8\x0F\x89\x50\xB5\x42\x2B\x21\z +\x7D\xC9\x81\x42\x08\x0D\x1F\xB9\x69\x2F\x51\x4D\xD3\x30\x46\x26\xA3\xA8\x11\x8E\x70\x3B\x4A\xA9\xAF\xA7\xAA\xEB\xF3\xE7\x9C\x77\xF8\x47\x96\x46\x64\xF3\xCF\x42\z +\x1F\xA5\x3E\x1A\x91\xDD\x18\xF0\x01\x28\x8C\xC8\x31\x34\x3C\x07\x16\x0C\x2C\xBB\x0F\x38\x03\x0A\x20\x07\xD6\x21\xE1\x15\xF0\x70\x78\xEF\x4C\x3D\xC0\x67\x6C\xA9\z +\x2B\x20\xED\xBB\xC8\xC7\x8E\x4B\xE0\x0A\xDC\x81\x59\x30\x38\xD1\x7A\x81\x2D\xF7\x1E\xBB\xEB\x30\xB0\xC3\x6F\xD8\x72\xA7\x41\x61\x87\x97\xC0\x25\x38\xEC\x32\xEB\z +\xFB\xE2\xA0\xAF\xDA\x88\x64\xD8\x7F\x35\xA5\xFB\x3C\xFD\xC3\xAE\x2B\xFD\x6C\x8B\x46\x24\xC5\xB6\x4F\xBF\x30\xDD\x5D\x69\xFB\x1A\x24\x5A\x3F\x00\xFA\x5E\x1E\x87\z +\x9C\x71\xD9\x1A\x57\x40\x9E\x68\x7D\x1A\xB0\xFE\x2D\x2A\x5E\x6F\x23\x1C\x61\x5F\x79\x02\xBB\x56\x3A\x5F\xEF\xFA\x40\x36\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\z +\x60\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_1_4.lua b/MIDI Editor/talagan_OneSmallStep/images/note_1_4.lua new file mode 100644 index 000000000..27a3512a5 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_1_4.lua @@ -0,0 +1,50 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x05\xC4\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x30\x2D\x63\x30\x30\x31\x20\x37\x39\x2E\x31\x34\x65\x63\x62\x34\x32\x66\x32\x63\x2C\x20\x32\x30\x32\x33\x2F\x30\x31\x2F\x31\x33\x2D\x31\x32\x3A\x32\x35\x3A\x34\z +\x34\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\z +\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\z +\x64\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\z +\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\z +\x61\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\z +\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\z +\x72\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\z +\x6F\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x31\x39\x38\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\z +\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\x34\z +\x33\x3A\x34\x39\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\z +\x54\x31\x36\x3A\x34\x33\x3A\x34\x39\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\z +\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x64\x31\x36\x34\x61\x37\x38\x33\x2D\x39\x65\x62\x61\x2D\x34\x32\x64\x64\x2D\x61\x65\x36\x63\x2D\x63\x63\x61\x38\x33\x39\x39\z +\x36\x34\x30\x33\x61\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x30\x39\x36\x36\x32\x66\x63\z +\x61\x2D\x35\x64\x34\x34\x2D\x34\x62\x35\x37\x2D\x62\x66\x63\x66\x2D\x30\x33\x66\x37\x33\x39\x30\x32\x35\x38\x66\x34\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\z +\x67\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x30\x39\x36\x36\x32\x66\x63\x61\x2D\x35\x64\x34\x34\x2D\x34\z +\x62\x35\x37\x2D\x62\x66\x63\x66\x2D\x30\x33\x66\x37\x33\x39\x30\x32\x35\x38\x66\x34\x22\x3E\x20\x3C\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\z +\x3C\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\z +\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x30\x39\x36\x36\x32\x66\x63\x61\x2D\x35\x64\x34\x34\z +\x2D\x34\x62\x35\x37\x2D\x62\x66\x63\x66\x2D\x30\x33\x66\x37\x33\x39\x30\x32\x35\x38\x66\x34\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x31\x39\x38\z +\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\z +\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\z +\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x73\x61\x76\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\z +\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x64\x31\x36\x34\x61\x37\x38\x33\x2D\x39\x65\x62\x61\x2D\x34\x32\x64\x64\x2D\x61\x65\x36\x63\x2D\z +\x63\x63\x61\x38\x33\x39\x39\x36\x34\x30\x33\x61\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\z +\x34\x33\x3A\x34\x39\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\z +\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x20\x73\x74\x45\x76\x74\x3A\x63\x68\x61\x6E\x67\x65\z +\x64\x3D\x22\x2F\x22\x2F\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\z +\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\z +\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\x6E\x20\xF0\x33\x00\x00\x00\x80\x49\x44\x41\x54\x48\x89\xED\xD6\xCB\x09\x80\x30\x10\x45\z +\xD1\x37\xE2\x3A\x68\x27\x96\x60\x07\xB6\xA0\x1D\x68\x29\x56\xA0\x9D\x58\x52\xC2\xA4\x80\xB8\x15\x3F\x0B\xE3\x27\x9B\x77\x61\x20\x04\xC2\x81\x59\x45\x42\x08\x48\z +\x51\x96\x44\x25\x4C\x78\x9F\x88\x1C\xC6\x79\xBF\x7C\x0E\x5F\x54\xA7\x82\xA3\x22\x4C\x98\x30\xE1\xE8\xF2\x98\x47\x56\xB5\x02\x50\xFC\x0A\x5B\xD5\x09\x40\xFB\x04\z +\x05\x6E\xAE\xDA\xAA\xF6\x27\xA8\xFB\x1C\x06\xD0\x9C\xDC\x0D\x7F\xC0\xE3\xE6\xEC\x00\x74\xA5\x31\x73\x0C\x2C\xFC\xDE\x12\x26\xFC\x56\x2B\x2C\x29\x19\x04\xC2\xCA\z +\x46\xF7\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_1_64.lua b/MIDI Editor/talagan_OneSmallStep/images/note_1_64.lua new file mode 100644 index 000000000..e10fd175f --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_1_64.lua @@ -0,0 +1,53 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x05\xC4\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x30\x2D\x63\x30\x30\x31\x20\x37\x39\x2E\x31\x34\x65\x63\x62\x34\x32\x66\x32\x63\x2C\x20\x32\x30\x32\x33\x2F\x30\x31\x2F\x31\x33\x2D\x31\x32\x3A\x32\x35\x3A\x34\z +\x34\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\z +\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\z +\x64\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\z +\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\z +\x61\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\z +\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\z +\x72\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\z +\x6F\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x31\x39\x38\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\z +\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\x34\z +\x33\x3A\x32\x31\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\z +\x54\x31\x36\x3A\x34\x33\x3A\x32\x31\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\z +\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x39\x66\x65\x39\x31\x35\x65\x38\x2D\x65\x39\x61\x38\x2D\x34\x30\x31\x61\x2D\x61\x61\x32\x37\x2D\x38\x32\x37\x33\x32\x39\x38\z +\x64\x63\x32\x62\x64\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x38\x30\x66\x37\x62\x31\x62\z +\x37\x2D\x39\x63\x39\x35\x2D\x34\x62\x35\x35\x2D\x62\x35\x38\x66\x2D\x32\x61\x36\x36\x30\x35\x64\x35\x66\x65\x66\x62\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\z +\x67\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x38\x30\x66\x37\x62\x31\x62\x37\x2D\x39\x63\x39\x35\x2D\x34\z +\x62\x35\x35\x2D\x62\x35\x38\x66\x2D\x32\x61\x36\x36\x30\x35\x64\x35\x66\x65\x66\x62\x22\x3E\x20\x3C\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\z +\x3C\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\z +\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x38\x30\x66\x37\x62\x31\x62\x37\x2D\x39\x63\x39\x35\z +\x2D\x34\x62\x35\x35\x2D\x62\x35\x38\x66\x2D\x32\x61\x36\x36\x30\x35\x64\x35\x66\x65\x66\x62\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x31\x39\x38\z +\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\z +\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\z +\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x73\x61\x76\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\z +\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x39\x66\x65\x39\x31\x35\x65\x38\x2D\x65\x39\x61\x38\x2D\x34\x30\x31\x61\x2D\x61\x61\x32\x37\x2D\z +\x38\x32\x37\x33\x32\x39\x38\x64\x63\x32\x62\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\z +\x34\x33\x3A\x32\x31\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\z +\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x20\x73\x74\x45\x76\x74\x3A\x63\x68\x61\x6E\x67\x65\z +\x64\x3D\x22\x2F\x22\x2F\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\z +\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\z +\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\x50\x16\x81\x13\x00\x00\x01\x07\x49\x44\x41\x54\x48\x89\xED\x96\xC1\x4D\x03\x31\x10\x45\z +\x9F\x11\x11\x37\x8B\xED\x20\x1D\xA4\x85\xDD\x0E\xE0\x8E\x04\x74\x40\x2A\x88\xA8\x20\x25\x84\x0E\x52\x02\x5C\xB8\x87\x0E\x72\xE3\x38\xAB\x9F\x02\xCC\xC1\x8B\xB4\z +\x84\x04\x79\x91\xB5\x7B\xF1\x97\x2C\x8F\x2C\x8D\x9F\xE6\xDB\x1E\xD9\x85\x10\x98\x42\x17\x93\x50\x0B\xB8\x80\xFB\x72\xCE\xFD\x1A\xED\xE1\xB0\x3D\x5E\xCB\x0E\x3E\z +\xA3\x1B\x93\x1E\xFE\x93\x98\xC3\xEA\x8D\x49\x4F\x53\x80\x9F\x81\xB5\x49\x9B\xB1\xC1\x0B\xA0\x61\xA0\xED\x39\xC0\x35\xB0\x06\x96\xC0\xFD\x98\xE0\x5B\x60\xDF\xC1\z +\x93\x75\x99\x01\xBC\x25\x5A\xDD\x02\xF3\xD4\xA4\x1C\x15\xEF\x80\x57\xE0\x03\xB8\x1E\x0D\x5C\x79\xDF\x10\xED\x5E\x11\xAB\x1E\x07\x6C\x92\x75\xC0\x86\x89\xAC\xAE\z +\xAF\x66\xB3\x64\x30\x21\x84\xA4\x71\x4A\x26\x85\x6E\xAE\x4D\x32\x93\x3E\x53\xF7\x1B\x74\xAB\x4D\xAA\x89\x6F\x75\x4E\xEF\x3C\x2B\xEF\xDF\x4C\x6A\x80\xF7\xD4\xBD\z +\x92\xC1\x5D\x57\xFA\xAB\x2D\xB6\xC4\xA7\x95\x17\xCC\xE9\xAE\xF4\xF8\x1D\x54\xDE\xEF\x81\xBB\xD4\xCF\xE3\x90\xCB\xB5\xEB\xC5\x2D\xB0\xAC\xBC\x7F\x19\x90\xFF\x43\z +\xAE\x7C\x6F\x0B\xB8\x80\x73\xE9\x0B\x46\x24\x8B\xC7\x90\xD9\x28\x9D\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_1_8.lua b/MIDI Editor/talagan_OneSmallStep/images/note_1_8.lua new file mode 100644 index 000000000..b355559c4 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_1_8.lua @@ -0,0 +1,52 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x05\xC4\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x30\x2D\x63\x30\x30\x31\x20\x37\x39\x2E\x31\x34\x65\x63\x62\x34\x32\x66\x32\x63\x2C\x20\x32\x30\x32\x33\x2F\x30\x31\x2F\x31\x33\x2D\x31\x32\x3A\x32\x35\x3A\x34\z +\x34\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\z +\x77\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\z +\x64\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\z +\x74\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\z +\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\z +\x61\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\z +\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\z +\x72\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\z +\x6F\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x31\x39\x38\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\z +\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\x34\z +\x33\x3A\x34\x33\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\z +\x54\x31\x36\x3A\x34\x33\x3A\x34\x33\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\z +\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x34\x38\x33\x34\x37\x38\x39\x37\x2D\x61\x33\x66\x34\x2D\x34\x31\x35\x34\x2D\x39\x63\x37\x36\x2D\x33\x37\x63\x33\x37\x62\x31\z +\x34\x34\x64\x63\x37\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x65\x62\x65\x66\x39\x37\x31\z +\x62\x2D\x30\x62\x62\x30\x2D\x34\x61\x36\x37\x2D\x62\x34\x65\x38\x2D\x36\x62\x38\x66\x30\x37\x34\x64\x31\x30\x35\x35\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\z +\x67\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x65\x62\x65\x66\x39\x37\x31\x62\x2D\x30\x62\x62\x30\x2D\x34\z +\x61\x36\x37\x2D\x62\x34\x65\x38\x2D\x36\x62\x38\x66\x30\x37\x34\x64\x31\x30\x35\x35\x22\x3E\x20\x3C\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\z +\x3C\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\z +\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x65\x62\x65\x66\x39\x37\x31\x62\x2D\x30\x62\x62\x30\z +\x2D\x34\x61\x36\x37\x2D\x62\x34\x65\x38\x2D\x36\x62\x38\x66\x30\x37\x34\x64\x31\x30\x35\x35\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x31\x39\x38\z +\x34\x2D\x30\x31\x2D\x32\x34\x54\x30\x39\x3A\x30\x30\x3A\x30\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\z +\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\z +\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x73\x61\x76\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\z +\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x34\x38\x33\x34\x37\x38\x39\x37\x2D\x61\x33\x66\x34\x2D\x34\x31\x35\x34\x2D\x39\x63\x37\x36\x2D\z +\x33\x37\x63\x33\x37\x62\x31\x34\x34\x64\x63\x37\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x32\x54\x31\x36\x3A\z +\x34\x33\x3A\x34\x33\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\z +\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x34\x2E\x32\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x20\x73\x74\x45\x76\x74\x3A\x63\x68\x61\x6E\x67\x65\z +\x64\x3D\x22\x2F\x22\x2F\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\z +\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\z +\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\x84\x6E\x14\x47\x00\x00\x00\xDD\x49\x44\x41\x54\x48\x89\xED\xD6\xCF\x0D\x82\x30\x18\x87\z +\xE1\xB7\xC6\xF3\x17\x3A\x82\x1B\x38\x82\x1B\xB8\x02\x4C\x20\x4C\xE0\x0C\x4E\x00\x9B\xE0\x08\x8E\xC0\x06\x25\x9F\x03\xE0\x85\x43\x45\x4C\x0A\x92\xE2\x81\x5F\xC2\z +\xA5\xB4\x7D\xD2\x7F\x69\x4D\xD7\x75\xAC\x91\xDD\x2A\xEA\x06\x6F\xB0\x1F\x63\xCC\xC7\xD7\x3E\x9F\xF5\xB0\x6C\x71\xF8\x4B\x4E\x4E\x35\x99\xD3\x70\x89\xA9\xBE\xAE\z +\x05\xE7\x4E\x35\x5D\x03\x06\x28\x9D\xEA\x31\x36\x7C\x00\x2A\xA0\x9E\xB2\xDE\x3F\xC3\x56\xA4\xB1\x22\x19\x70\x07\xF2\x68\xB0\x97\x02\x38\x47\x87\xAD\x48\x03\x24\z +\xD1\xE1\x3E\x4D\x74\xB8\xDF\xD5\x8F\xE8\x30\x70\x01\x6E\xA1\x95\xF7\x53\x7B\xEF\x47\x96\x8C\xFC\x6A\xAD\x48\x13\xFA\xA2\x31\xC1\x15\x8D\xC1\xA9\x96\x40\xEA\x97\z +\x5B\x91\xB7\x9B\x21\xB4\xBF\xE0\xA9\x76\xAA\xF9\x10\x05\xDA\xD0\xF6\xB3\x61\xC6\xCF\x68\x11\x03\xF6\x37\x4E\x0B\x64\x56\xA4\x9A\x0B\x07\xAF\xF1\xD2\xF9\xFF\xA7\z +\xCF\x06\x6F\xF0\xD4\xBC\x00\xA4\x5F\x3D\x97\xB2\x66\xE0\xBD\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_dotted.lua b/MIDI Editor/talagan_OneSmallStep/images/note_dotted.lua new file mode 100644 index 000000000..05e8774f8 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_dotted.lua @@ -0,0 +1,50 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x05\xC3\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x31\x2D\x63\x30\x30\x32\x20\x37\x39\x2E\x66\x33\x35\x34\x65\x66\x63\x37\x30\x2C\x20\x32\x30\x32\x33\x2F\x31\x31\x2F\x30\x39\x2D\x31\x32\x3A\x30\x35\x3A\x35\x33\z +\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\z +\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\x64\z +\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\x74\z +\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\x74\z +\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\x68\z +\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\x31\z +\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\z +\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\z +\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\x72\z +\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x35\x2E\x34\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\z +\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x32\x30\x31\x37\x2D\x31\x31\x2D\x31\x38\x54\x32\x32\x3A\x33\x30\x3A\x34\x30\z +\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x35\x54\x31\x32\x3A\x31\x36\z +\x3A\x34\x36\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x35\x54\z +\x31\x32\x3A\x31\x36\x3A\x34\x36\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\x68\z +\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\z +\x78\x6D\x70\x2E\x69\x69\x64\x3A\x38\x32\x37\x62\x61\x63\x31\x64\x2D\x35\x35\x63\x32\x2D\x34\x63\x62\x39\x2D\x39\x33\x31\x32\x2D\x61\x34\x35\x31\x39\x30\x30\x30\z +\x65\x33\x39\x62\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x65\x33\x39\x30\x65\x66\x30\x34\z +\x2D\x38\x65\x64\x31\x2D\x34\x61\x32\x63\x2D\x39\x61\x34\x38\x2D\x30\x61\x32\x34\x64\x63\x64\x37\x31\x38\x62\x32\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\x67\z +\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x65\x33\x39\x30\x65\x66\x30\x34\x2D\x38\x65\x64\x31\x2D\x34\x61\z +\x32\x63\x2D\x39\x61\x34\x38\x2D\x30\x61\x32\x34\x64\x63\x64\x37\x31\x38\x62\x32\x22\x3E\x20\x3C\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\z +\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\x20\z +\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x65\x33\x39\x30\x65\x66\x30\x34\x2D\x38\x65\x64\x31\x2D\z +\x34\x61\x32\x63\x2D\x39\x61\x34\x38\x2D\x30\x61\x32\x34\x64\x63\x64\x37\x31\x38\x62\x32\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x31\x37\z +\x2D\x31\x31\x2D\x31\x38\x54\x32\x32\x3A\x33\x30\x3A\x34\x30\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\z +\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x35\x2E\x34\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\x20\z +\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x73\x61\x76\x65\x64\x22\x20\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\z +\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x38\x32\x37\x62\x61\x63\x31\x64\x2D\x35\x35\x63\x32\x2D\x34\x63\x62\x39\x2D\x39\x33\x31\x32\x2D\x61\z +\x34\x35\x31\x39\x30\x30\x30\x65\x33\x39\x62\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x35\x54\x31\x32\x3A\x31\z +\x36\x3A\x34\x36\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\z +\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x35\x2E\x34\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x20\x73\x74\x45\x76\x74\x3A\x63\x68\x61\x6E\x67\x65\x64\z +\x3D\x22\x2F\x22\x2F\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\x66\z +\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\x3F\z +\x78\x70\x61\x63\x6B\x65\x74\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\xED\xC1\x0B\x74\x00\x00\x00\x75\x49\x44\x41\x54\x48\x89\xED\xD6\x31\x0A\x80\x20\x18\x86\xE1\z +\xD7\xE8\x06\x8D\x9D\xA1\xB5\x23\x78\xB2\xB6\x2E\xD1\xD2\xD0\xD4\x19\x3A\x97\x83\x2D\x0E\x05\x0E\x69\xA2\xCB\xF7\x82\x28\xC2\xCF\x03\x4E\x1A\xEF\x3D\x2D\xEA\x9A\z +\xA8\x82\x05\x7F\xE8\x6A\x05\x8F\xAD\xE0\xEC\x04\x0B\x16\x2C\x38\xBB\x3E\x63\xC6\x02\x43\x6D\xF8\x04\xA6\xBF\x28\xA4\x3D\xF5\x1A\x41\x5D\x0D\x78\x8E\xDC\xED\x61\z +\xB7\x80\x0F\xAB\x38\x7C\x3C\xCE\x0E\xD8\x80\x25\x61\xFE\x95\xD1\xF7\x56\xB0\xE0\x52\xDD\xAE\x95\x0F\xE4\x29\x97\x89\x7D\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\z +\x60\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/images/note_triplet.lua b/MIDI Editor/talagan_OneSmallStep/images/note_triplet.lua new file mode 100644 index 000000000..38c719a94 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/images/note_triplet.lua @@ -0,0 +1,46 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +return "\z +\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x1E\x00\x00\x00\x1E\x08\x06\x00\x00\x00\x3B\x30\xAE\xA2\x00\x00\x00\x09\x70\x48\x59\z +\x73\x00\x00\x0B\x13\x00\x00\x0B\x13\x01\x00\x9A\x9C\x18\x00\x00\x04\xF4\x69\x54\x58\x74\x58\x4D\x4C\x3A\x63\x6F\x6D\x2E\x61\x64\x6F\x62\x65\x2E\x78\x6D\x70\x00\z +\x00\x00\x00\x00\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\x20\x62\x65\x67\x69\x6E\x3D\x22\xEF\xBB\xBF\x22\x20\x69\x64\x3D\x22\x57\x35\x4D\x30\x4D\x70\x43\x65\x68\x69\z +\x48\x7A\x72\x65\x53\x7A\x4E\x54\x63\x7A\x6B\x63\x39\x64\x22\x3F\x3E\x20\x3C\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x3D\x22\x61\x64\z +\x6F\x62\x65\x3A\x6E\x73\x3A\x6D\x65\x74\x61\x2F\x22\x20\x78\x3A\x78\x6D\x70\x74\x6B\x3D\x22\x41\x64\x6F\x62\x65\x20\x58\x4D\x50\x20\x43\x6F\x72\x65\x20\x39\x2E\z +\x31\x2D\x63\x30\x30\x32\x20\x37\x39\x2E\x66\x33\x35\x34\x65\x66\x63\x37\x30\x2C\x20\x32\x30\x32\x33\x2F\x31\x31\x2F\x30\x39\x2D\x31\x32\x3A\x30\x35\x3A\x35\x33\z +\x20\x20\x20\x20\x20\x20\x20\x20\x22\x3E\x20\x3C\x72\x64\x66\x3A\x52\x44\x46\x20\x78\x6D\x6C\x6E\x73\x3A\x72\x64\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\z +\x77\x2E\x77\x33\x2E\x6F\x72\x67\x2F\x31\x39\x39\x39\x2F\x30\x32\x2F\x32\x32\x2D\x72\x64\x66\x2D\x73\x79\x6E\x74\x61\x78\x2D\x6E\x73\x23\x22\x3E\x20\x3C\x72\x64\z +\x66\x3A\x44\x65\x73\x63\x72\x69\x70\x74\x69\x6F\x6E\x20\x72\x64\x66\x3A\x61\x62\x6F\x75\x74\x3D\x22\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x3D\x22\x68\x74\z +\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x64\x63\x3D\x22\x68\x74\z +\x74\x70\x3A\x2F\x2F\x70\x75\x72\x6C\x2E\x6F\x72\x67\x2F\x64\x63\x2F\x65\x6C\x65\x6D\x65\x6E\x74\x73\x2F\x31\x2E\x31\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x70\x68\z +\x6F\x74\x6F\x73\x68\x6F\x70\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x70\x68\x6F\x74\x6F\x73\x68\x6F\x70\x2F\x31\z +\x2E\x30\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x78\x6D\x70\x4D\x4D\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\x63\x6F\x6D\x2F\x78\x61\z +\x70\x2F\x31\x2E\x30\x2F\x6D\x6D\x2F\x22\x20\x78\x6D\x6C\x6E\x73\x3A\x73\x74\x45\x76\x74\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x6E\x73\x2E\x61\x64\x6F\x62\x65\x2E\z +\x63\x6F\x6D\x2F\x78\x61\x70\x2F\x31\x2E\x30\x2F\x73\x54\x79\x70\x65\x2F\x52\x65\x73\x6F\x75\x72\x63\x65\x45\x76\x65\x6E\x74\x23\x22\x20\x78\x6D\x70\x3A\x43\x72\z +\x65\x61\x74\x6F\x72\x54\x6F\x6F\x6C\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x35\x2E\x34\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\z +\x73\x68\x29\x22\x20\x78\x6D\x70\x3A\x43\x72\x65\x61\x74\x65\x44\x61\x74\x65\x3D\x22\x32\x30\x31\x37\x2D\x31\x31\x2D\x31\x38\x54\x32\x31\x3A\x32\x39\x3A\x31\x36\z +\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x6F\x64\x69\x66\x79\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x35\x54\x31\x32\x3A\x30\x38\z +\x3A\x33\x37\x2B\x30\x31\x3A\x30\x30\x22\x20\x78\x6D\x70\x3A\x4D\x65\x74\x61\x64\x61\x74\x61\x44\x61\x74\x65\x3D\x22\x32\x30\x32\x34\x2D\x30\x32\x2D\x30\x35\x54\z +\x31\x32\x3A\x30\x38\x3A\x33\x37\x2B\x30\x31\x3A\x30\x30\x22\x20\x64\x63\x3A\x66\x6F\x72\x6D\x61\x74\x3D\x22\x69\x6D\x61\x67\x65\x2F\x70\x6E\x67\x22\x20\x70\x68\z +\x6F\x74\x6F\x73\x68\x6F\x70\x3A\x43\x6F\x6C\x6F\x72\x4D\x6F\x64\x65\x3D\x22\x33\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x49\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\z +\x78\x6D\x70\x2E\x69\x69\x64\x3A\x62\x37\x66\x62\x31\x38\x64\x30\x2D\x64\x32\x65\x37\x2D\x34\x34\x30\x65\x2D\x38\x32\x66\x65\x2D\x38\x39\x39\x66\x61\x32\x63\x61\z +\x66\x36\x34\x35\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x62\x37\x66\x62\x31\x38\x64\x30\z +\x2D\x64\x32\x65\x37\x2D\x34\x34\x30\x65\x2D\x38\x32\x66\x65\x2D\x38\x39\x39\x66\x61\x32\x63\x61\x66\x36\x34\x35\x22\x20\x78\x6D\x70\x4D\x4D\x3A\x4F\x72\x69\x67\z +\x69\x6E\x61\x6C\x44\x6F\x63\x75\x6D\x65\x6E\x74\x49\x44\x3D\x22\x78\x6D\x70\x2E\x64\x69\x64\x3A\x62\x37\x66\x62\x31\x38\x64\x30\x2D\x64\x32\x65\x37\x2D\x34\x34\z +\x30\x65\x2D\x38\x32\x66\x65\x2D\x38\x39\x39\x66\x61\x32\x63\x61\x66\x36\x34\x35\x22\x3E\x20\x3C\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\z +\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x72\x64\x66\x3A\x6C\x69\x20\x73\x74\x45\x76\x74\x3A\x61\x63\x74\x69\x6F\x6E\x3D\x22\x63\x72\x65\x61\x74\x65\x64\x22\x20\z +\x73\x74\x45\x76\x74\x3A\x69\x6E\x73\x74\x61\x6E\x63\x65\x49\x44\x3D\x22\x78\x6D\x70\x2E\x69\x69\x64\x3A\x62\x37\x66\x62\x31\x38\x64\x30\x2D\x64\x32\x65\x37\x2D\z +\x34\x34\x30\x65\x2D\x38\x32\x66\x65\x2D\x38\x39\x39\x66\x61\x32\x63\x61\x66\x36\x34\x35\x22\x20\x73\x74\x45\x76\x74\x3A\x77\x68\x65\x6E\x3D\x22\x32\x30\x31\x37\z +\x2D\x31\x31\x2D\x31\x38\x54\x32\x31\x3A\x32\x39\x3A\x31\x36\x2B\x30\x31\x3A\x30\x30\x22\x20\x73\x74\x45\x76\x74\x3A\x73\x6F\x66\x74\x77\x61\x72\x65\x41\x67\x65\z +\x6E\x74\x3D\x22\x41\x64\x6F\x62\x65\x20\x50\x68\x6F\x74\x6F\x73\x68\x6F\x70\x20\x32\x35\x2E\x34\x20\x28\x4D\x61\x63\x69\x6E\x74\x6F\x73\x68\x29\x22\x2F\x3E\x20\z +\x3C\x2F\x72\x64\x66\x3A\x53\x65\x71\x3E\x20\x3C\x2F\x78\x6D\x70\x4D\x4D\x3A\x48\x69\x73\x74\x6F\x72\x79\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x44\x65\x73\x63\x72\x69\z +\x70\x74\x69\x6F\x6E\x3E\x20\x3C\x2F\x72\x64\x66\x3A\x52\x44\x46\x3E\x20\x3C\x2F\x78\x3A\x78\x6D\x70\x6D\x65\x74\x61\x3E\x20\x3C\x3F\x78\x70\x61\x63\x6B\x65\x74\z +\x20\x65\x6E\x64\x3D\x22\x72\x22\x3F\x3E\xB5\x44\x43\x07\x00\x00\x00\xA3\x49\x44\x41\x54\x48\x89\xED\x94\xE1\x0D\xC2\x20\x10\x85\x3F\x9C\xA0\x23\x38\x82\x6E\x80\z +\x9B\xB9\x41\x47\xE9\x08\xB8\x41\x57\xE8\x06\x75\x83\xE7\x0F\xAF\xFF\x0A\x5A\x30\x69\x4C\xEF\x25\x17\x2E\x1C\xDC\xC7\x0B\x84\x20\x89\x3D\x74\xDA\x85\xEA\x60\x07\z +\x3B\xF8\xF0\xE0\x1E\x18\x81\xD9\xF2\x6D\x92\x54\x13\x51\x6F\x45\x49\x77\xCB\x37\xF5\x08\x0D\x7F\x75\x04\x3A\x73\xFB\x04\xAE\xBF\x70\x9C\xD3\x52\x3F\x4B\x4A\x36\z +\x97\x24\x75\x5F\xEE\xFB\xE8\x58\x40\xC8\x9C\xF5\x62\x0E\x27\x20\x99\xF3\xDC\xDA\x7C\xAF\x82\xE3\x52\x6D\x30\x97\xB3\x45\xE9\x3E\x57\x7B\xD5\xBC\xEA\x87\x8D\xA3\z +\x39\xBF\x55\xF4\x68\x7A\x5C\x4D\xFA\xCB\x0F\xC4\xC1\x0E\x76\xB0\x83\x0F\x06\x7E\x01\x13\x9D\x3C\xFD\x04\x23\xFC\x38\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\z +\x82" +; diff --git a/MIDI Editor/talagan_OneSmallStep/talagan_OneSmallStep Engine lib.lua b/MIDI Editor/talagan_OneSmallStep/talagan_OneSmallStep Engine lib.lua new file mode 100644 index 000000000..f5ad6af3b --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/talagan_OneSmallStep Engine lib.lua @@ -0,0 +1,421 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +local scriptDir = debug.getinfo(1,"S").source:match[[^@?(.*[\/])[^\/]-$]]; +local upperDir = scriptDir:match( "((.*)[\\/](.+)[\\/])(.+)$" ); + +package.path = scriptDir .."?.lua;".. package.path + +local helper_lib = require "talagan_OneSmallStep Helper lib"; + +-- Defines +local noteLenLookup = { + ["1"] = {next="1", prec="1_2", qn=4 }, + ["1_2"] = {next="1", prec="1_4", qn=2 }, + ["1_4"] = {next="1_2", prec="1_8", qn=1 }, + ["1_8"] = {next="1_4", prec="1_16", qn=0.5 }, + ["1_16"] = {next="1_8", prec="1_32", qn=0.25 }, + ["1_32"] = {next="1_16", prec="1_64", qn=0.125 }, + ["1_64"] = {next="1_32", prec="1_64", qn=0.0625 } +}; + +local InputMode = { + None=0, + Pedal=1, + Keyboard=2, + Action=3 +} + +local NoteLenModifier = { + Straight=0, + Dotted=1, + Triplet=2 +} + + +local function DBG(m) + --reaper.ShowConsoleMsg(m .. "\n"); +end + +local function setMode(m) + reaper.SetExtState("OneSmallStep", "Mode", tostring(m), true) +end +local function getMode() + return tonumber(reaper.GetExtState("OneSmallStep", "Mode")) or 0; +end + +local function setNoteLen(str) + -- Persist the param + reaper.SetExtState("OneSmallStep", "NoteLen", str, true); +end +local function getNoteLen() + local nl = reaper.GetExtState("OneSmallStep", "NoteLen"); + if nl == "" or nl == nil then + return "1_4"; + end + return nl; +end + +local function setNoteLenModifier(m) + reaper.SetExtState("OneSmallStep", "NoteLenModifier", tostring(m), true); +end +local function getNoteLenModifier() + return tonumber(reaper.GetExtState("OneSmallStep", "NoteLenModifier")); +end +local function getNoteLenModifierFactor() + local m = getNoteLenModifier(); + + if m == NoteLenModifier.Straight then + return 1.0; + elseif m == NoteLenModifier.Dotted then + return 1.5; + elseif m == NoteLenModifier.Triplet then + return 2/3.0; + end + + return 1.0; +end + +local function increaseNoteLen() + local l = getNoteLen(); + setNoteLen(noteLenLookup[l].next); +end + +local function decreaseNoteLen() + local l = getNoteLen(); + setNoteLen(noteLenLookup[l].prec); +end + +local function getNoteLenQN() + local nl = getNoteLen(); + return noteLenLookup[nl].qn; +end + + +local function ArrangeViewIsNotFocused() + return reaper.GetCursorContext() == -1 +end + +local function IsInMIDIEditor() + -- This is the best we can do but it's still dangerous ... + -- (will return true whenever the arrange view is not focused) + return ArrangeViewIsNotFocused(); +end + + +-- This function returns the take that should be edited. +-- Inspired by tenfour's scripts but modified +-- It uses a strategy based on : +-- - What component has focus (midi editor or arrange window) +-- - What items are selected +-- - What items contain the cursor +-- - What tracks are selected + +local function TakeForEdition() + local take = nil + + local midiEditor = reaper.MIDIEditor_GetActive(); + local midiEditorOk = not (reaper.MIDIEditor_GetMode(midiEditor) == -1); + + -- Prioritize the currently focused MIDI editor. + if midiEditorOk and IsInMIDIEditor() then + -- -1 if ME not focused + take = reaper.MIDIEditor_GetTake(midiEditor); + if reaper.ValidatePtr(take, 'MediaItem_Take*') then + return take + end + end + + -- If no take can be gotten from the MIDI Editors + -- try to find a Media Item that is under the cursor + + local mediaItemCount = reaper.CountSelectedMediaItems(0); + local cursorPos = reaper.GetCursorPosition(); + + local candidates = {}; + + for i = 0, mediaItemCount - 1 do + + local mediaItem = reaper.GetSelectedMediaItem(0, i) + local track = reaper.GetMediaItem_Track(mediaItem) + local pos = reaper.GetMediaItemInfo_Value(mediaItem, "D_POSITION") + local len = reaper.GetMediaItemInfo_Value(mediaItem, "D_LENGTH") + local tsel = reaper.IsTrackSelected(track); + + local fudge = 0.002; + local left = pos - fudge; + local right = pos + len + fudge; + + -- Only keep items that contain the cursor pos + if cursorPos >= left and cursorPos <= right then + local tk = reaper.GetActiveTake(mediaItem); + candidates[#candidates + 1] = { take = tk, tsel = tsel, tname = reaper.GetTrackName(track), name = reaper.GetTakeName(tk) } + end + end + + table.sort(candidates, function(e1,e2) + -- Priorize items that have their track selected + local l1 = e1.tsel and 0 or 1; + local l2 = e2.tsel and 0 or 1; + + return l1 < l2; + end); + + if (#candidates) > 0 then + return candidates[1].take; + end + + return nil +end + +-- Commits the currently held notes into the take +local function commit(take, notes) + + --[[ + local grid_len, swing, note_len = reaper.MIDI_GetGrid(take); + + if note_len == 0 then + note_len = grid_len; + end + ]]-- + + local note_len = getNoteLenQN() * getNoteLenModifierFactor(); + + local noteStartTime = reaper.GetCursorPosition() + local noteStartQN = reaper.TimeMap2_timeToQN(0, noteStartTime) + local noteEndTime = reaper.TimeMap2_QNToTime(0, noteStartQN + note_len) + + local mediaItem = reaper.GetMediaItemTake_Item(take) + local track = reaper.GetMediaItemTake_Track(take) + + if #notes > 0 then + local noteStartPPQ = reaper.MIDI_GetPPQPosFromProjTime(take, noteStartTime) + local noteEndPPQ = reaper.MIDI_GetPPQPosFromProjTime(take, noteEndTime) + + for k,v in pairs(notes) do + reaper.MIDI_InsertNote(take, true, false, noteStartPPQ, noteEndPPQ, v.chan, v.note, v.velocity) + end + end + + -- Advance and mark dirty + reaper.UpdateItemInProject(mediaItem) + reaper.SetEditCurPos(noteEndTime, false, false); + reaper.MarkTrackItemsDirty(track, mediaItem) +end + +-------------------------------------------------------------------- +--------------------------------------------------------------------- + +-- The next functions are used to manage a +-- Table to keep track of key activities +-- With inertia, to avoid losing events for chords +-- When releasing keys (the release events may not be totally synchronized) +local trackKeyActivity = {}; +local keyInertia = 0.2; + +local function keepTrackOfKeysForTrack(track, pressed_keys) + local trackid = reaper.GetTrackGUID(track); + local t = reaper.time_precise(); + + if trackKeyActivity[trackid] == nil then + trackKeyActivity[trackid] = { } + end + + for _, v in pairs(pressed_keys) do + local k = tostring(math.floor(v.chan+0.5)) .. "," .. tostring(math.floor(v.note+0.5)) + trackKeyActivity[trackid][k] = { + note=v.note, + chan=v.chan, + velocity=v.velocity, + ts=t + }; + end +end + +local function keyActivityForTrack(track) + local trackid = reaper.GetTrackGUID(track); + local track_activity = trackKeyActivity[trackid]; + + if track_activity == nil then + return {} + end + + ttta = track_activity; + + local ret = {}; + for _, v in pairs(track_activity) do + ret[#ret+1] = v; + end + + return ret +end + +local function clearTrackActivityForTrack(track) + local trackid = reaper.GetTrackGUID(track); + trackKeyActivity[trackid] = {}; +end + +local function clearOutdatedTrackActivity() + local t = reaper.time_precise(); + + -- Do some cleanup + for guid, track_activity in pairs(trackKeyActivity) do + local torem = {}; + for k, note_info in pairs(track_activity) do + if t - note_info.ts > keyInertia then + torem[#torem+1] = k + end + end + + for k,v in pairs(torem) do + track_activity[v] = nil; + end + end +end + +-------------------------------------------------------------------- +--------------------------------------------------------------------- + +-- Listen to events from instrumented tracks that have the JSFX companion effect installed (or install it if not present) +local function listenToEvents(called_from_action) + + local mode = getMode(); + + -- Input mode should be engaged + if mode == InputMode.None then + return; + end + + -- Reaper should not be in play/pause/rec state + if (not (reaper.GetPlayState()==0)) then + return; + end + + local take = TakeForEdition(); + + if not take then + return + end + + local track = reaper.GetMediaItemTake_Track(take); + local recarmed = reaper.GetMediaTrackInfo_Value(track, "I_RECARM"); + + -- If track is not armed for recording, ignore everything + if not (recarmed == 1) then + return; + end + + -- Add helper FX if it is missing + local helper_status = helper_lib.getOrInstallHelperFx(track); + if helper_status == -1 then + return -42; + end + + local oss_state = helper_lib.oneSmallStepState(track); + + if mode == InputMode.Pedal then + if oss_state.pedalActivity > 0 then + + -- Pedal event, commit new notes + reaper.Undo_BeginBlock(); + -- Acknowledge the pedal + helper_lib.resetPedalActivity(track); + commit(take, oss_state.pitches); + reaper.Undo_EndBlock("One Small Step - Add notes on pedal event",-1); + end + elseif mode == InputMode.Action then + if called_from_action then + reaper.Undo_BeginBlock(); + commit(take, oss_state.pitches); + reaper.Undo_EndBlock("One Small Step - Add notes on action",-1); + end + elseif mode == InputMode.Keyboard then + clearOutdatedTrackActivity(); + keepTrackOfKeysForTrack(track, oss_state.pitches) + + local trackid = reaper.GetTrackGUID(track); + local lastKnown = keyActivityForTrack(track); + + if lastKnown then + -- We had some notes in our memory + -- But now it's not the case anymore. + -- It's a realease key event + if #lastKnown ~= 0 and #oss_state.pitches == 0 then + reaper.Undo_BeginBlock(); + commit(take, lastKnown); + -- Acknowledge note activity. + clearTrackActivityForTrack(track); + reaper.Undo_EndBlock("One Small Step - Add notes on key(s) release",-1); + end + end + + if oss_state.pedalActivity > 0 then + -- Allow the use of the pedal in keyboard mode + -- To insert rests + reaper.Undo_BeginBlock(); + -- Acknowledge the pedal + helper_lib.resetPedalActivity(track); + commit(take, {} ); + reaper.Undo_EndBlock("One Small Step - Add rest on pedal event",-1); + end + end + +end + +function reaperActionCommit() + listenToEvents(true); +end + +function atStart() + -- Do some cleanup at engine start + -- But this adds an undo entry point ... + -- So rely on the user instead to cleanup the JSFXs using the relevant action + -- If there's one day a way to prevent reaper from creating Undo points + -- Then we can uncomment this automatic cleanup + --reaper.Undo_BeginBlock() + --helper_lib.cleanupAllTrackFXs(); + --reaper.Undo_EndBlock("One Small Step - Cleanup companion JSFXs",-1); +end + +function atExit() + -- See comment in atStart + --reaper.Undo_BeginBlock() + --helper_lib.cleanupAllTrackFXs(); + --reaper.Undo_EndBlock("One Small Step - Cleanup companion JSFXs",-1); +end + +function atLoop() + return listenToEvents(); +end + + +return { + -- Enums + InputMode = InputMode, + NoteLenModifier = NoteLenModifier, + + --Functions + setMode = setMode, + getMode = getMode, + + getNoteLenModifier = getNoteLenModifier, + setNoteLenModifier = setNoteLenModifier, + getNoteLenModifierFactor = getNoteLenModifierFactor, + + setNoteLen = setNoteLen, + getNoteLen = getNoteLen, + getNoteLenQN = getNoteLenQN, + + increaseNoteLen = increaseNoteLen, + decreaseNoteLen = decreaseNoteLen, + + atStart = atStart, + atExit = atExit, + atLoop = atLoop, + + reaperActionCommit = reaperActionCommit, + + TakeForEdition = TakeForEdition, +} diff --git a/MIDI Editor/talagan_OneSmallStep/talagan_OneSmallStep Helper lib.lua b/MIDI Editor/talagan_OneSmallStep/talagan_OneSmallStep Helper lib.lua new file mode 100644 index 000000000..1e2ccc934 --- /dev/null +++ b/MIDI Editor/talagan_OneSmallStep/talagan_OneSmallStep Helper lib.lua @@ -0,0 +1,115 @@ +-- @noindex +-- @author Ben 'Talagan' Babut +-- @license MIT +-- @description This is part of One Small Step + +-- Largely inspired by tenfour's version +-- However, I prefer using an extensive list of JS params +-- To avoid having REAPER creating undo points when polling for notes +-- This allow the undo command to work properly +local jsfx = {} + +jsfx.name = "One Small Step Helper" + +jsfx.paramIndex_PedalActivity = 0 +jsfx.paramIndex_NotesInBuffer = 1 +jsfx.paramIndex_NoteStart = 2 + +-- Add the given fx to the given track. +local function getOrAddInputFx(track, fx) + + local idx = reaper.TrackFX_AddByName(track, fx.name, true, 1) + + if idx == -1 or idx == nil then + return -1 + end + + -- Use 0x1000000 as flag for input fx chain + idx = idx|0x1000000 + + return idx +end + +-- Remove the given fx from the given track +local function removeInputFx(track, fx) + -- Only lookup, do not instantiate + local idx = reaper.TrackFX_AddByName(track, fx.name, true, 0); + + if idx == -1 or idx == nil then + return + end + + -- Use 0x1000000 as flag for input fx chain + idx = idx|0x1000000; + + res = reaper.TrackFX_Delete(track, idx); +end + + + +local function getOrInstallHelperFx(track) + return getOrAddInputFx(track, jsfx) +end +local function removeHelperFx(track) + return removeInputFx(track, jsfx); +end + + +-- Cleanup helper function +local function cleanupAllTrackFXs() + local tc = reaper.CountTracks(0); + + local ti = 0 + while(ti < tc) do + local track = reaper.GetTrack(0, ti); + removeHelperFx(track); + ti = ti + 1; + end +end + +-- Poll the JSFX state from a track +local function oneSmallStepState(track) + + local recarmed = reaper.GetMediaTrackInfo_Value(track, "I_RECARM"); + + -- Security when recording + if not (recarmed == 1) then + return { + pitches = {}, + pedalActivity = 0 + } + end + + -- Make sure helper is installed + local iHelper = getOrAddInputFx(track, jsfx, true) + + local pitches = {} + local pedalActivity = reaper.TrackFX_GetParam(track, iHelper, jsfx.paramIndex_PedalActivity); + local heldNoteCount = reaper.TrackFX_GetParam(track, iHelper, jsfx.paramIndex_NotesInBuffer) + + for i = 1, heldNoteCount, 1 do + -- now the plugin updates its sliders to give us the values for this index. + pitches[#pitches+1] = {} + pitches[#pitches].note = reaper.TrackFX_GetParam(track, iHelper, jsfx.paramIndex_NoteStart + 3*(i-1) + 0) + pitches[#pitches].chan = reaper.TrackFX_GetParam(track, iHelper, jsfx.paramIndex_NoteStart + 3*(i-1) + 1) + pitches[#pitches].velocity = reaper.TrackFX_GetParam(track, iHelper, jsfx.paramIndex_NoteStart + 3*(i-1) + 2) + end + + return { + pitches = pitches, + pedalActivity = pedalActivity + } +end + +local function resetPedalActivity(track) + local iHelper = getOrAddInputFx(track, jsfx, true) + reaper.TrackFX_SetParam(track, iHelper, jsfx.paramIndex_PedalActivity, 0); +end + +return { + getOrInstallHelperFx = getOrInstallHelperFx, + removeHelperFx = removeHelperFx, + cleanupAllTrackFXs = cleanupAllTrackFXs, + oneSmallStepState = oneSmallStepState, + resetPedalActivity = resetPedalActivity +}; diff --git a/MIDI Editor/talagan_OneSmallStep/toolbar_icons/toolbar_one_small_step.png b/MIDI Editor/talagan_OneSmallStep/toolbar_icons/toolbar_one_small_step.png new file mode 100644 index 000000000..4c991566c Binary files /dev/null and b/MIDI Editor/talagan_OneSmallStep/toolbar_icons/toolbar_one_small_step.png differ diff --git a/MIDI Editor/talagan_OneSmallStep/toolbar_icons/toolbar_one_small_step_cleanup.png b/MIDI Editor/talagan_OneSmallStep/toolbar_icons/toolbar_one_small_step_cleanup.png new file mode 100644 index 000000000..5a605af09 Binary files /dev/null and b/MIDI Editor/talagan_OneSmallStep/toolbar_icons/toolbar_one_small_step_cleanup.png differ