Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revisionBoth sides next revision | ||
mozaic_tips_and_tricks [2020/07/13 08:29] – Updated 'Include Snippets' _ki | mozaic_tips_and_tricks [2021/04/12 17:59] – NoteOn Velocity 0 _ki | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Mozaic: Scripting Tips & Tricks ====== | ====== Mozaic: Scripting Tips & Tricks ====== | ||
- | ~~NOTOC~~ {{tag> | + | ~~NOTOC~~ {{tag> |
This wiki page contains programming tips & tricks for [[mozaic_plugin_engine|Mozaic]] | This wiki page contains programming tips & tricks for [[mozaic_plugin_engine|Mozaic]] | ||
+ | * [[#NoteOn Velocity 0 Special Case]] | ||
* [[#Two dimensional Arrays]] | * [[#Two dimensional Arrays]] | ||
* [[#Multi dimensional Arrays]] | * [[#Multi dimensional Arrays]] | ||
* [[#Store two positive Values into a single Variable]] | * [[#Store two positive Values into a single Variable]] | ||
* [[#Store three unsigned Bytes into a single Variable]] | * [[#Store three unsigned Bytes into a single Variable]] | ||
+ | * [[#Output Fixed Point Values in Labels]] | ||
* [[#Some Best Practice Tips]] | * [[#Some Best Practice Tips]] | ||
+ | * [[#Detect Long or Short Pad Taps]] | ||
+ | * [[#Detect Long or Short SHIFT Button Taps]] | ||
* [[# | * [[# | ||
+ | * [[#Dynamic Letters for Labeling]] | ||
* [[#Use the SHIFT Button to toggle to HELP View]] | * [[#Use the SHIFT Button to toggle to HELP View]] | ||
* [[#Use a Knob to toggle 16 Pads View to HELP View]] | * [[#Use a Knob to toggle 16 Pads View to HELP View]] | ||
* [[#Knob double-tap Support]] | * [[#Knob double-tap Support]] | ||
+ | * [[#Remove or add an entry inside an array]] | ||
* [[#Using Logic Operators in Expressions instead of IF cases]] | * [[#Using Logic Operators in Expressions instead of IF cases]] | ||
* [[#Using Inc and Dec in Expressions]] | * [[#Using Inc and Dec in Expressions]] | ||
* [[# | * [[# | ||
* [[#Include Snippets]] | * [[#Include Snippets]] | ||
+ | |||
+ | ===== NoteOn Velocity 0 Special Case===== | ||
+ | < | ||
+ | The Midi Spec allows to use a NoteOn command with velocity zero instead of a NoteOff command. If this combination is received by Mozaic, this midi command is automatically converted to
NoteOff vel 0 - even for the @OnMidiInput event and when checking MidiByte1. | ||
+ | |||
+ | Therefore scripts don‘t need to check for this ‚NoteOn Vel 0‘ case, as that special case is handled by Mozaic. Even when using MidiThrough, | ||
+ | |||
===== Two dimensional Arrays ===== | ===== Two dimensional Arrays ===== | ||
Line 80: | Line 92: | ||
varB = 124 // allowed range 0 .. ~16000 | varB = 124 // allowed range 0 .. ~16000 | ||
| | ||
- | combinedValue = valA + valB * maxA | + | combinedValue = valA + (valB * maxA) |
</ | </ | ||
+ | |||
+ | For single-byte MIDI values, use 128 for maxA | ||
To later extract the values from their packed format use | To later extract the values from their packed format use | ||
Line 116: | Line 130: | ||
</ | </ | ||
+ | |||
+ | \\ | ||
+ | ===== Output Fixed Point Values in Labels ===== | ||
+ | < | ||
+ | When outputting floating point values into labels (knobs, pads, titles) Moazic generates either a 4 digit fraction string | ||
+ | like 42.5000 (if a remainder present) or an integer value without fraction. | ||
+ | |||
+ | \\ | ||
+ | To always output a positive float with two digits (even when integer), one needs to split the input value and output the computed integer parts individually: | ||
+ | < | ||
+ | n = Round value * 100 | ||
+ | f = Div n, 100 | ||
+ | d = n-f*100 | ||
+ | r1 = Div d, 10 | ||
+ | r2 = d % 10 | ||
+ | LabelKnob 0, {B: | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | To always output a negative and positive float with a single digit, the split needs to work on the absolute value | ||
+ | and a conditional statement is used to output both variants: | ||
+ | < | ||
+ | n = Round Abs(value * 10) | ||
+ | f = Div n, 10 | ||
+ | r = (n-f*10) % 10 | ||
+ | if value >=0 | ||
+ | LabelKnob 1, {N: +},f,{.},r | ||
+ | else | ||
+ | LabelKnob 1, {N: },f,{.},r | ||
+ | endif | ||
+ | </ | ||
\\ | \\ | ||
Line 144: | Line 189: | ||
</ | </ | ||
+ | |||
+ | \\ | ||
+ | ===== Detect Long or Short Pad Taps ===== | ||
+ | < | ||
+ | |||
+ | < | ||
+ | @OnLoad | ||
+ | FillArray downStart, | ||
+ | pressTime = 250 | ||
+ | @End | ||
+ | |||
+ | @OnPadDown | ||
+ | downStart[LastPad] = SystemTime | ||
+ | @End | ||
+ | |||
+ | @OnPadUp | ||
+ | pad = LastPad | ||
+ | if SystemTime - downStart[pad] < pressTime | ||
+ | Log {Short tap pad }, pad | ||
+ | else | ||
+ | Log {Long tap pad }, pad | ||
+ | endif | ||
+ | @End | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ===== Detect Long or Short SHIFT Button Taps ===== | ||
+ | < | ||
+ | |||
+ | < | ||
+ | @OnLoad | ||
+ | shiftStart = 0 | ||
+ | pressTime | ||
+ | @End | ||
+ | |||
+ | @OnShiftDown | ||
+ | shiftStart = SystemTime | ||
+ | @End | ||
+ | |||
+ | @OnShiftUp | ||
+ | if SystemTime - shiftStart < pressTime | ||
+ | Log {Short tap SHIFT} | ||
+ | else | ||
+ | Log {Long tap SHIFT} | ||
+ | endif | ||
+ | @End | ||
+ | </ | ||
\\ | \\ | ||
Line 157: | Line 250: | ||
LabelPad 0,{Line 1},{ | LabelPad 0,{Line 1},{ | ||
LabelPad 1,{Upper},{ -------------- },{Lower} | LabelPad 1,{Upper},{ -------------- },{Lower} | ||
+ | @End | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | ===== Dynamic Letters for Labeling ===== | ||
+ | < | ||
+ | The NoteName function of Moazic can be used to dynamically output the letters A-G inside the label string definitions of Knobs, Pads or Logs. This allows to construct labels like ‚Bank A‘ to ‚Bank D‘, or ‚Preset A-1‘ to ‚Preset F-8‘. | ||
+ | |||
+ | < | ||
+ | @OnLoad | ||
+ | ShowLayout 2 | ||
+ | ABCDEFG | ||
+ | |||
+ | for i = 0 to 15 | ||
+ | row = 1 + (i>7) | ||
+ | id = i%8 | ||
+ | if (id < 7) | ||
+ | LabelPad i, {Pad },(NoteName ABCDEFG[id], | ||
+ | endif | ||
+ | endfor | ||
@End | @End | ||
</ | </ | ||
Line 279: | Line 392: | ||
+ | \\ | ||
+ | ===== Remove or add an entry inside an array ===== | ||
+ | < | ||
+ | Instead of running through an array with a FOR loop to shift entries to either insert or remove an intermedeate enry, it is way faster to use the CopyArray Mozaic function: | ||
+ | |||
+ | < | ||
\\ | \\ | ||
+ | === Remove an entry of an array (shift left) === | ||
+ | |||
+ | < | ||
+ | @OnLoad | ||
+ | for i=0 to 6 | ||
+ | a[i] = i | ||
+ | endfor | ||
+ | Log {Before },a[0],{ },a[1],{ },a[2],{ },a[3],{ },a[4],{ },a[5],{ },a[6] | ||
+ | |||
+ | // Remove entry a[2] by left shift of the following entries | ||
+ | CopyArray a[3], a[2], 6 | ||
+ | | ||
+ | Log {After | ||
+ | @End | ||
+ | </ | ||
+ | |||
+ | \\ | ||
+ | === Insert an entry into array (shift right) === | ||
+ | |||
+ | Due to the inner working of CopyArray, the above trick doesn‘t work for right shifts - but one can use a temporary array to be more efficient than iterating over the array: | ||
+ | |||
+ | < | ||
+ | @OnLoad | ||
+ | for i=0 to 6 | ||
+ | a[i] = i | ||
+ | endfor | ||
+ | Log {Before | ||
+ | |||
+ | // Insert a new a[2] | ||
+ | CopyArray a[2], _tmp, 6 | ||
+ | CopyArray _tmp, a[3], 6 | ||
+ | a[2] = 9 | ||
+ | | ||
+ | Log {After | ||
+ | @End | ||
+ | </ | ||
===== Using Logic Operators in Expressions instead of IF cases ===== | ===== Using Logic Operators in Expressions instead of IF cases ===== | ||
< | < | ||
Line 378: | Line 533: | ||
< | < | ||
- | On PatchStorage you can find several ' | + | On PatchStorage you can find several ' |
- | I tried to make them as 'developer-friendly' | + | The snippets can be seen as 'well tested library functions'. For the current available include snippets, you copy their main code to the end of you script and call one or two initialization event functions in your @OnLoad. |
- | show the snippets | + | The snippet in turn will later call event that you need to define in your code (callbacks). |
+ | All of the current available | ||
- | The snippets can be seen as 'well tested library functions'. | + | I tried to make them as 'developer-friendly' |
- | ^PatchStorage | + | ^PatchStorage |
- | | [[https:// | + | | [[https:// |
- | | [[https:// | + | | [[https:// |
+ | | [[https:// |