SEQUENCER EXTENSIONS -------------------- layers: [master-inaccessible] -> tracks -> channels -> voices pulse=256hz update tick=arbitrary hz update (may use track tempo or other setting) ROUTINES TRACK: reset pulse tick user command (1) block pre-process block post-process CHANNEL: reset pulse tick user command (2) VOICE: new note pulse tick user command (3) lose focus note released [MODIFIER] [MODES] volume disabled, scale, add, override panning disabled, scale, add, override pitch disabled, ?, add (linear), override cutoff disabled, scale, add, override resonance disabled, scale, add, override routine C prototypes void (*vexr)( extensionData * ) void (*cexr)( extensionData * ) void (*gexr)( extensionData * ) typdef struct { void *element; // voice,channel,or track seqModifier *mod; // modifier for element void *lmem; // memory for element void *gmem; // global memory u32 param1; u32 param2; } extensionInfo; user: param1 = header param2 = data user command types: global executed on global level channel executed on channel level voice executed on channel's current voice gvoice executed on all voices associated with channel memory: global region per-channel region per-voice region PROGRAM VECTORS: 00 GLOBAL:RESET 01 GLOBAL:PULSE 02 GLOBAL:TICK 03 GLOBAL:USER 04 GLOBAL:PREPROCESS 05 GLOBAL:POSTPROCESS 06 GLOBAL:RESERVED1 07 GLOBAL:RESERVED2 10 CHANNEL:RESET 11 CHANNEL:PULSE 12 CHANNEL:TICK 13 CHANNEL:USER 14 CHANNEL:RESERVED1 15 CHANNEL:RESERVED2 16 CHANNEL:RESERVED3 17 CHANNEL:RESERVED4 20 VOICE:NEWNOTE 21 VOICE:PULSE 22 VOICE:TICK 23 VOICE:USER 24 VOICE:LOSEFOCUS 25 VOICE:RELEASE 26 VOICE:RESERVED1 27 VOICE:RESERVED2 ---------------------------------------------- modes scale: volume: v = v * a | v=[0,1], a=[0,1] pan: p = p + (a-0.5)*(0.5-Abs(Pan-0.5)) | p=[0,1], a=[0,1] pitch: undefined cutoff: c = c * a resonance: r = r * a add: add value and saturate result override: overwrite value with modifier