Skip to content
Permalink
grid2
Go to file
 
 
Cannot retrieve contributors at this time
872 lines (843 sloc) 46.5 KB
#include "help_mode.h"
// this
#include "globals.h"
#include "keyboard_helper.h"
// libavr32
#include "font.h"
#include "region.h"
// asf
#include "conf_usb_host.h" // needed in order to include "usb_protocol_hid.h"
#include "usb_protocol_hid.h"
////////////////////////////////////////////////////////////////////////////////
// Help text ///////////////////////////////////////////////////////////////////
#define HELP_PAGES 13
#define HELP1_LENGTH 59
const char* help1[HELP1_LENGTH] = { "1/13 HELP",
"[ ] NAVIGATE HELP PAGES",
"UP/DOWN TO SCROLL",
" ",
"TAB|EDIT/LIVE/PATTERN",
"PRT SC|JUMP TO LIVE",
"NUM LOCK|JUMP TO PATTERN",
"F1-F10|EXECUTE SCRIPT",
"ALT-F1-F10|EDIT SCRIPT",
"CTRL-F1-F8|MUTE SCRIPT",
"CTRL-F9|STOP/START METRO",
"ESC|SCENE",
"ALT-ESC|WRITE",
" ",
"ALT-X|CUT",
"ALT-C|COPY",
"ALT-V|PASTE",
" ",
"// LIVE",
"ENTER|EXECUTE",
"UP|PREVIOUS",
"SH-BSP|CLEAR",
"CTRL-L/R|JUMP WORDS",
"~|TOGGLE VARS",
"ALT-G|GRID VISUALIZER",
"ALT-ARROWS|MOVE IN GRID",
"ALT-SH-ARRS|SELECT AREA",
"ALT-SPACE|PRESS IN GRID",
"ALT-PRTSC|INSERT X Y W H",
"ALT-/|CHANGE GRID PAGE",
"ALT-\\|TOGGLE CONTROL VIEW",
" ",
"// EDIT",
"[ ]|PREV, NEXT SCRIPT",
"ENTER|ADD/OVERWRITE",
"CTRL-Z|UNDO",
"SH-ENTER|INSERT",
"SH-BSP|CLEAR",
"SH-UP/DOWN|SELECT LINES",
"ALT-SLASH|DISABLE LINE(S)",
"ALT-DELETE|DELETE LINE(S)",
"ALT-UP/DN|MOVE LINE(S)",
" ",
"// PATTERN",
"ARROWS|NAVIGATE",
"ALT-ARROWS|JUMP",
"0-9|NUMERIC ENTRY",
"-|FLIP SIGN",
"SPACE|TOGGLE 0/1",
"ENTER|COMMIT CHANGE",
"[ ]|NUDGE UP, DOWN",
"SH-ALT-V|INSERT PASTE",
"SH-BSP|DELETE",
"SH-ENTER|DUPE INSERT",
"SH-L|SET LENGTH",
"SH-S|SET START",
"SH-E|SET END",
"ALT-L,S,E|JUMP",
"SHIFT-2|SHOW/HIDE TURTLE" };
#define HELP2_LENGTH 13
const char* help2[HELP2_LENGTH] = { "2/13 VARIABLES",
" ",
"X, Y, Z|GENERAL PURPOSE",
"T|USE FOR TIME",
"A, B, C, D|ASSIGNED TO 1-4",
" ",
"// SPECIAL VARIABLES",
"I|USED BY LOOP",
"O|INCREMENTS ON READ",
"DRUNK|INC BY -1, 0, +1",
"Q|SHIFT REGISTER",
"Q.N|SET Q LENGTH",
"Q.AVG|AVERAGE OF ALL Q" };
#define HELP3_LENGTH 26
const char* help3[HELP3_LENGTH] = { "3/13 PARAMETERS",
" ",
"TR A-D|SET TR VALUE (0,1)",
"TR.TIME A-D|TR PULSE TIME",
"CV 1-4|CV TARGET VALUE",
"CV.SLEW 1-4|CV SLEW TIME (MS)",
"CV.SET 1-4|SET CV (NO SLEW)",
"CV.OFF 1-4|ADD CV OFFSET",
" ",
"IN|GET IN JACK VAL",
"IN.SCALE X Y",
" SCALE IN RANGE",
"PARAM|GET KNOB VAL",
"PARAM.SCALE X Y",
" SCALE KNOB RANGE",
" ",
"M|METRO TIME (MS)",
"M.ACT|ENABLE METRO (0/1)",
"M.RESET|HARD RESET TIMER",
" ",
"TIME|TIMER COUNT (MS)",
"TIME.ACT|ENABLE TIMER (0/1)",
" ",
"SCRIPT A|GET/RUN SCRIPT",
"SCENE|GET/SET SCENE #",
"LAST N|GET SCRIPT LAST RUN" };
#define HELP4_LENGTH 11
const char* help4[HELP4_LENGTH] = { "4/13 DATA AND TABLES",
" ",
"ALL PARAMS HAVE 16B RANGE",
"-32768 TO 32767",
" ",
"// LOOKUP TABLES",
"N 0-127|CONVERT TO 1V/8VE",
"V 0-10|VOLT LOOKUP",
"VV 0-1000|V WITH 2 DECIMALS",
"BPM 2-MAX|MS PER BPM",
"EXP X|EXPO LOOKUP" };
#define HELP5_LENGTH 56
const char* help5[HELP5_LENGTH] = { "5/13 OPERATORS",
" ",
"RAND A|RANDOM 0 - A",
"RRAND A B|RANDOM A - B",
"TOSS|RANDOM 0 OR 1",
" ",
"CHAOS|CHAOTIC NUMBER",
"CHAOS.R|CHAOS PARAMETER",
"CHAOS.ALG|CHAOS ALGORITHM",
" ",
"AVG A B|AVERAGE OF INS",
"MIN A B|LESSER OF INS",
"MAX A B|GREATER OF INS",
" ",
"ADD A B|A + B",
"SUB A B|A - B",
"MUL A B|A * B",
"DIV A B|A / B",
"MOD A B|REMAINDER OF A / B",
" ",
"// LOGIC COMPARISONS",
"RETURNS 1 (TRUE) OR 0 (FALSE)",
"EQ A B|A EQUALS B",
"NE A B|A NOT EQUAL TO B",
"GT A B|A GREATER THAN B",
"LT A B|A LESS THAN B",
"EZ A|A EQUALS 0",
"NZ A|A NOT EQUAL TO 0",
"? A B C|TERNARY IF",
" ",
"RSH A B|BITSHIFT A RIGHT B",
"LSH A B|BITSHIFT A LEFT B",
"| A B|BITWISE A OR B",
"& A B|BITWISE A AND B",
"^ A B|BITWISE A XOR B",
"~ A|BITWISE NOT A",
"BSET A B|SET BIT B OF A",
"BGET A B|GET BIT B OF A",
"BCLR A B|CLEAR BIT B OF A",
" ",
"LIM A B C|CLAMP A WITHIN B-C",
"WRAP A B C|WRAP A AROUND B-C",
"SCALE A B X Y I",
" SCALE I FROM A..B TO X..Y",
"QT A B|QUANTIZE A TO B*X",
" ",
"// EUCLIDEAN OPERATOR",
"ER F L I",
" F = FILL (1-32)",
" L = LENGTH (1-32)",
" I = STEP (ANY)",
" RETURNS 0 OR 1",
" ",
"// SPECIAL OPERATORS",
"TR.TOG X|FLIP STATE OF TR X",
"TR.PULSE X|PULSE TR X" };
#define HELP6_LENGTH 31
const char* help6[HELP6_LENGTH] = { "6/13 PRE :",
" ",
"EACH PRE NEEDS A : FOLLOWED",
"BY A COMMAND TO OPERATE ON",
" ",
"PROB A: | PROBABALITY 0-100",
" ",
"DEL A: |DELAY BY A (MS)",
"DEL.CLR|KILL ALL DELAYS",
" ",
"S: |PUSH ONTO STACK",
"S.CLR|CLEAR S",
"S.ALL|EXECUTE ALL S",
"S.POP|EXECUTE NEWEST S",
"S.L|QUERY LENGTH OF S",
" ",
"IF A: |EXECUTE IF NON-ZERO",
"ELIF A: |AFTER IF WHEN TRUE",
"ELSE: |AFTER FAILED IF",
" ",
"L A B: |ITERATE FROM A-B",
"NB: I IS UPDATED EACH TIME",
" ",
"W X:|ITERATE WHILE X",
" ",
"EVERY X:|EXECUTE EACH X",
"SKIP X:|EXECUTE EACH BUT X",
"OTHER:|EXECUTE OTHERWISE",
"SYNC X|SYNC TO STEP X",
" ",
"BREAK|STOP EXECUTION" };
#define HELP7_LENGTH 37
const char* help7[HELP7_LENGTH] = { "7/13 PATTERNS",
" ",
"// DIRECT ACCESS",
"P A|GET VAL AT INDEX A",
"P A B|SET VAL AT A TO B",
"P.N A|SELECT BANK A",
"PN A B|GET BANK A, IDX B",
"PN A B C|BANK A, IDX B TO C",
" ",
"// CHANGES LENGTH",
"P.INS A B|INSERT B AT IDX A",
"P.RM A|DELETE ENTRY AT A",
"P.PUSH A|ADD A TO END",
"P.POP|RETURN & REM LAST",
" ",
"// ACTIVE RANGE",
"P.L A|GET/SET LENGTH",
"P.WRAP A|ENABLE WRAPPING",
"P.START A|GET/SET START",
"P.END A|GET/SET END",
" ",
"// READ HEAD",
"P.I A|GET/SET POSITION",
"P.HERE A|GET/SET VAL AT P.I",
"P.NEXT A|GET/SET NEXT POS",
"P.PREV A|GET/SET PREV POS",
"P.RND A|GET RANDOM VALUE",
"P.MIN A|GET MIN VALUE",
"P.MAX A|GET MAX VALUE",
" ",
"// INCREMENT/DECREMENT",
"P.+ A B|INC VALUE A BY B",
"P.- A B|DEC VALUE A BY B",
"P.+W A B C D",
" |INC AND WRAP TO C..D",
"P.-W A B C D",
" |DEC AND WRAP TO C..D" };
#define HELP8_LENGTH 135
const char* help8[HELP8_LENGTH] = { "8/13 GRID",
" ",
"G.RST|RESET EVERYTHING",
"G.CLR|CLEAR ALL LEDS",
"G.DIM level|SET DIM LEVEL",
"G.ROTATE 1/0",
" |ROTATE GRID",
"G.KEY x y action",
" |EMULATE KEY PRESS",
" ",
"GROUPS",
"G.GRP id|CURRENT GROUP",
"G.GRP.EN id|ENABLE GROUP",
"G.GRP.RST id|RESET GROUP",
"G.GRP.SW id|SWITCH TO GROUP",
"G.GRP.SC id|ASSIGN SCRIPT",
"G.GRPI|GET LATEST GROUP",
" ",
"LEDS / RECTANGLES",
"-1 DIM",
"-2 BRIGHTEN",
"-3 CLEAR",
"G.LED x y l|DRAW DOT",
"G.LED.C x y|CLEAR DOT",
"G.REC x y w h fill border",
"G.RCT x1 y1 x2 y2 fill border",
" DRAW RECTANGLE",
" ",
"BUTTONS",
"G.BTN id x y w h ",
" latch level script",
"G.GBT grp id x y w h",
" latch level script",
"G.BTX id x y w h",
" lt lvl scr cols rows",
"G.GBX grp id x y w h lt",
" lt lvl scr cols rows",
" ",
"G.BTN.EN id",
" ENABLE BUTTON",
"G.BTN.X id|G.BTN.X id x",
" GET OR SET X COORDINATE",
"G.BTN.Y id|G.BTN.Y id y",
" GET OR SET Y COORDINATE",
"G.BTN.V id|G.BTN.V id val",
" GET OR SET VALUE",
"G.BTN.L id G.BTN.L id level",
" GET OR SET LEVEL",
"G.BTNI",
" ID OF LAST PRESSED",
"G.BTNX|G.BTNX x",
" GET/SET X OF LAST PR",
"G.BTNY|G.BTNY y",
" GET/SET Y OF LAST PR",
"G.BTNV|G.BTNV value",
" GET/SET VALUE OF LAST PR",
"G.BTNL G.BTNL level",
" GET/SET LEVEL OF LAST PRESSED",
"G.BTN.SW id",
" SWITCH BUTTON",
"G.BTN.PR id action",
" EMULATE BUTTON PRESS",
"G.GBTN.V group value",
" SET VALUE FOR ALL IN GROUP",
"G.GBTN.L grp odd_lvl even_lvl",
" SET LEVEL FOR ALL IN GROUP",
"G.GBTN.C group",
" GET COUNT OF ALL PRESSED",
"G.GBTN.I group index",
" GET IDS OF PRESSED BY INX",
"G.GBTN.W group",
" GET PRESSED WIDTH",
"G.GBTN.H group",
" GET PRESSED HEIGHT",
"G.GBTN.X1 group",
" GET LEFTMOST PRESSED X",
"G.GBTN.X2 group",
" GET RIGHTMOST PRESSED X",
"G.GBTN.Y1 group",
" GET HIGHEST PRESSED",
"G.GBTN.Y2 group",
" GET LOWEST PRESSED",
" ",
"FADERS",
"0 COARSE HORIZ BAR",
"1 COARSE VERT BAR",
"2 COARSE HORIZ DOT",
"3 COARSE VERT DOT",
"4 FINE HORIZ BAR",
"5 FINE VERT BAR",
"6 FINE HORIZ DOT",
"7 FINE VERT DOT",
"G.FDR id x y w h",
" type level script",
"G.GFD group id x y w h",
" type level script",
"G.FDX id x y w h",
" type lvl scr cols rows",
"G.GFX group id x y w h",
" type lvl scr cols rows",
" ",
"G.FDR.EN id|G.FDR.EN id 1/0",
" ENABLE FADER",
"G.FDR.X id|G.FDR.X id x",
" GET OR SET X COORDINATE",
"G.FDR.Y id|G.FDR.Y id y",
" GET OR SET Y COORDINATE",
"G.FDR.V id|G.FDR.V id value",
" GET OR SET VALUE",
"G.FDR.N id|G.FDR.N id value",
" GET OR SET VALUE (UNITS)",
"G.FDR.L id|G.FDR.L id level",
" GET OR SET LEVEL",
"G.FDRI",
" ID OF LAST PRESSED",
"G.FDRX|G.FDRX x",
" GET/SET X OF LAST PRESSED",
"G.FDRY|G.FDRY y",
" GET/SET Y OF LAST PRESSED",
"G.FDRV|G.FDRV value",
" GET/SET VALUE OF LAST PR",
"G.FDRN|G.FDRN value",
" AS ABOVE IN LED UNITS",
"G.FDRL G.FDRL level",
" GET/SET LEVEL OF LAST PR",
"G.FDR.PR id value",
" EMULATE FADER PRESS",
"G.GFDR.V group value",
" SET VALUE FOR ALL IN GROUP",
"G.GFDR.N group value",
" AS ABOVE IN LED UNITS",
"G.GFDR.L grp odd_lvl even_lvl",
" SET LEVEL FOR ALL IN GROUP",
"G.GFDR.RN group min max",
" SET FADER RANGE FOR .V" };
#define HELP9_LENGTH 17
const char* help9[HELP9_LENGTH] = { "9/13 TURTLE",
" ",
"// CRAWLS TRACKER DATA",
"@|GET/SET DATA",
"@X/@Y|GET/SET POSITION",
"@F X1 Y1 X2 Y2",
" |SET FENCE",
" OR @FX1/@FY1/@FX2/@FY2",
"@BUMP 1|STOP AT FENCE",
"@WRAP 1|WRAP AT FENCE",
"@BOUNCE 1|BOUNCE OFF FENCE",
"@MOVE X Y|MOVE RELATIVE",
"@DIR 0-360|GET/SET DIRECTION",
"@SPEED|GET/SET CENTICELLS",
"@STEP|MOVE AT SPEED/DIR",
"@SCRIPT N|GET/SET EDGE SCRIPT",
"@SHOW 1/0|DISPLAY < ON TRACKER" };
#define HELP10_LENGTH 36
const char* help10[HELP10_LENGTH] = { "10/13 TELEX INPUT",
" ",
"TI.PARAM X|(TI.PRM)",
" GET KNOB VALUE",
"TI.PARAM.QT X",
" KNOB VALUE QUANTIZED",
"TI.PARAM.N X",
" KNOB AS SCALE NOTE",
"TI.PARAM.SCALE X",
" SELECT KNOB QUANT SCALE",
"TI.PARAM.MAP X Y Z",
" MAP KNOB VALUE TO Y..Z",
"TI.IN X",
" GET INPUT VAL",
"TI.IN.QT X",
" IN VALUE QUANTIZED",
"TI.IN.N X",
" IN AS SCALE NOTE",
"TI.IN.SCALE X",
" SELECT IN QUANT SCALE",
"TI.IN.MAP X Y Z",
" MAP IN VALUE TO Y..Z",
"TI.PARAM.INIT X",
" RESET KNOB X",
"TI.IN.INIT X",
" RESET IN X",
"TI.INIT D",
" RESET DEVICE D",
"TI.PARAM.CALIB X Y",
" CALIBRATE KNOB X",
"TI.IN.CALIB X Y",
" CALIBRATE IN X",
"TI.STORE D",
" STORE CALIB FOR DEVICE D",
"TI.RESET D",
" RESET CALIB FOR DEVICE D" };
#define HELP11_LENGTH 164
const char* help11[HELP11_LENGTH] = { "11/13 TELEX OUTPUT",
" ",
"TO.TR X Y",
" SET TR VALUE (0/1)",
"TO.TR.TOG X",
" TOGGLE TR",
"TO.TR.P X",
" PULSE TR",
"TO.TR.P.DIV X Y",
" SET TR X CLOCK DIV TO Y",
"TO.TR.P.MUTE X Y",
" MUTE TR X (0/1)",
"TO.TR.TIME X Y",
" SET TR PULSE TIME (MS)",
"TO.TR.TIME.S X Y",
" SET TR PULSE TIME (SEC)",
"TO.TR.TIME.M",
" SET TR PULSE TIME (MIN)",
"TO.TR.WIDTH X Y",
" SET TR DUTY (%)",
"TO.TR.POL X Y",
" SET TR POLARITY",
"TO.TR.M.ACT X Y",
" ENABLE METRO (0/1)",
"TO.TR.M X Y",
" SET METRO RATE (MS)",
"TO.TR.M.S X Y",
" SET METRO RATE (SEC)",
"TO.TR.M.M X Y",
" SET METRO RATE (MIN)",
"TO.TR.M.BPM X Y",
" SET METRO RATE (BPM)",
"TO.TR.M.COUNT X Y",
" SET METRO REPEAT",
"TO.TR.M.MUL X Y",
" SET METRO MULT",
"TO.TR.M.SYNC X",
" SYNC METRO",
"TO.M.ACT D Y",
" ENABLE DEVICE METRO (0/1)",
"TO.M D Y",
" SET DEVICE METRO RATE (MS)",
"TO.M.S D Y",
" AS ABOVE IN SECONDS",
"TO.M.M D Y",
" AS ABOVE IN MINUTES",
"TO.M.BPM D Y",
" AS ABOVE IN BPM",
"TO.M.COUNT D Y",
" SET DEVICE METRO REPEAT",
"TO.M.SYNC D",
" SYNC DEVICE METRO",
"TO.CV X Y",
" SET CV WITH SLEW",
"TO.CV.SLEW X Y",
" SET CV SLEW (MS)",
"TO.CV.SLEW.S X Y",
" SET CV SLEW (SEC)",
"TO.CV.SLEW.M",
" SET CV SLEW (MIN)",
"TO.CV.SET X Y",
" SET CV WITH NO SLEW",
"TO.CV.OFF X Y",
" SET CV OFFSET",
"TO.CV.QT X Y",
" SET CV QUANTIZED",
"TO.CV.QT.SET X Y",
" AS ABOVE NO SLEW",
"TO.CV.N X Y",
" SET CV TO SCALE NOTE",
"TO.CV.N.SET X Y",
" AS ABOVE NO SLEW",
"TO.CV.LOG X Y",
" SET CV LOG MODE",
"TO.OSC X Y",
" SET CV OSC FREQ",
"TO.OSC.SET X Y",
" AS ABOVE NO SLEW",
"TO.OSC.QT X Y",
" SET CV OSC QUANTIZED",
"TO.OSC.QT.SET X Y",
" AS ABOVE NO SLEW",
"TO.OSC.N X Y",
" SET CV OSC TO SCALE NOTE",
"TO.OSC.N.SET X Y",
" AS ABOVE NO SLEW",
"TO.OSC.FQ X Y",
" SET CV OSC (HZ)",
"TO.OSC.LFO X Y",
" SET CV LFO RATE (MILLIHZ)",
"TO.OSC.LFO.SET X Y",
" AS ABOVE NO SLEW",
"TO.OSC.CYC X Y",
" SET CV OSC CYCLE (MS)",
"TO.OSC.CYC.SET X Y",
" AS ABOVE NO SLEW",
"TO.OSC.CYC.S X Y",
" SET CV OSC CYCLE (SEC)",
"TO.OSC.CYC.S.SET X Y",
" AS ABOVE NO SLEW",
"TO.OSC.CYC.M X Y",
" SET CV OSC CYCLE (MIN)",
"TO.OSC.CYC.M.SET X Y",
" AS ABOVE NO SLEW",
"TO.OSC.SCALE X Y",
" CV X QT SCALE Y",
"TO.OSC.WAVE X Y",
" SELECT CV OSC WAVEFORM",
"TO.OSC.RECT X Y",
" SET OSC RECTIFY (-2..2)",
"TO.OSC.WIDTH X Y",
" SET OSC PULSEWIDTH",
"TO.OSC.SYNC X",
" RESET OSC PHASE",
"TO.OSC.PHASE X Y",
" SET OSC PHASE",
"TO.OSC.SLEW X Y",
" SET OSC SLEW (MS)",
"TO.OSC.SLEW.S X Y",
" SET OSC SLEW (SEC)",
"TO.OSC.SLEW.M X Y",
" SET OSC SLEW (MIN)",
"TO.OSC.CTR X Y",
" SET OSC CENTER",
"TO.ENV.ACT X Y",
" ENABLE ENV (1/0)",
"TO.ENV X Y",
" SET ENV GATE (1/0)",
"TO.ENV.TRIG X Y",
" TRIGGER ENV",
"TO.ENV.ATT X Y",
" SET ENV ATTACK (MS)",
"TO.ENV.ATT.S X Y",
" SET ENV ATTACK (SEC)",
"TO.ENV.ATT.M X Y",
" SET ENV ATTACK (MIN)",
"TO.ENV.DEC X Y",
" SET ENV DECAY (MS)",
"TO.ENV.DEC.S X Y",
" SET ENV DECAY (SEC)",
"TO.ENV.DEC.M X Y",
" SET ENV DECAY (MIN)",
"TO.ENV.EOR X N",
" PULSE TR N AT END OF RISE",
" TR ON SAME DEVICE",
"TO.ENV.EOC X N",
" AS ABOVE FOR END OF CYCLE",
"TO.ENV.LOOP X Y",
" LOOP ENV Y TIMES",
" 0 TO LOOP INDEFINITELY",
"TO.TR.INIT X",
" RESET TR",
"TO.CV.INIT X",
" RESET CV",
"TO.INIT D",
" RESET DEVICE",
"TO.KILL D",
" CANCEL DEVICE TR PULSES",
" AND CV SLEW",
"TO.CV.CALIB X",
" SAVE TO.CV.OFF X",
" AS CALIB VALUE",
"TO.CV.RESET X",
" RESET CV CALIB" };
#define HELP12_LENGTH 115
const char* help12[HELP12_LENGTH] = { "12/13 ANSIBLE",
" ",
"KR.PRE / KR.PRE X",
" RETURN/LOAD CURRENT PRESET",
"KR.PERIOD / KR.PERIOD X",
" GET/SET INTERNAL PERIOD",
"KR.PAT / KR.PAT X",
" GET/SET CURRENT PATTERN",
"KR.SCALE / KR.SCALE X",
" GET/SET CURRENT SCALE",
"KR.POS X Y / KR.POS X Y Z",
" GET/SET POSITION Z",
" FOR TRACK X PARAM Y",
"KR.L.ST X Y",
" GET LOOP START FOR",
" TRACK X, PARAM Y",
"KR.L.ST X Y Z",
" LOOP START FOR",
" TRACK X, PARAM Y TO Z",
"KR.L.LEN X Y",
" GET LENGTH OF",
" TRACK X, PARAM Y",
"KR.L.LEN X Y Z",
" SET LENGTH OF",
" TRACK X, PARAM Y TO Z",
"KR.RES X Y",
" RESET POSITION",
" FOR TRACK X, PARAM Y",
"KR.CV X",
" GET CV FOR CHANNEL X",
"KR.MUTE X / KR.MUTE X Y",
" GET/SET MUTE STATE",
" FOR CHANNEL X",
"KR.TRMUTE X",
" TOGGLE MUTE STATE",
" FOR CHANNEL X",
"KR.CLK X",
" ADVANCE THE CLOCK",
" FOR CHANNEL X",
" (MUST BE ENABLED!)",
"ME.PRE / ME.PRE X",
" RETURN/LOAD CURRENT PRESET",
"ME.SCALE / ME.SCALE X",
" GET/SET CURRENT SCALE",
"ME.PERIOD / ME.PERIOD X",
" GET/SET CLOCK PERIOD",
"ME.STOP X",
" STOP CHANNEL X (0 = ALL)",
"ME.RES X",
" RESET CHANNEL X (0 = ALL)",
" ALSO USED AS START",
"ME.CV X",
" GET CV FOR CHANNEL X",
"LV.PRE / LV.PRE X",
" RETURN/LOAD CURRENT PRESET",
"LV.RES X",
" RESET (0 ON NEXT CLK,1 NOW)",
"LV.POS / LV.POS X",
" GET/SET CURRENT POSITION",
"LV.L.ST / LV.L.ST X",
" GET/SET LOOP START",
"LV.L.LEN / LV.L.LEN X",
" GET/SET LOOP LENGTH",
"LV.L.DIR / LV.L.DIR X",
" GET/SET LOOP DIRECTION",
"LV.CV X",
" GET CV FOR CHANNEL X",
"CY.PRE / CY.PRE X",
" RETURN/LOAD CURRENT PRESET",
"CY.RES X",
" RESET CHANNEL X (0 = ALL)",
"CY.POS X / CY.POS X Y",
" GET/SET CHANNEL POSITION",
" X = 0 TO SET ALL",
" POSITION BETWEEN 0-255",
"CY.REV X",
" REVERSE CHANNEL X (0 = ALL)",
"MID.SLEW T",
" SET PITCH SLEW TIME",
" TO T IN MS",
"MID.SHIFT X",
" SHIFT PITCH BY TT PITCH X",
" (E.G. N 6, V -1)",
"ARP.HLD X",
" 0 DISABLES KEY HOLD",
" OTHER VALUES ENABLE",
"ARP.STY X",
" SET ARP STYLE (0-7)",
"ARP.GT V G",
" SET GATE LENGTH FOR VOICE V",
" TO G (0-127, SYNCED TO CLK)",
"ARP.SLEW V T",
" SET SLEW TIME FOR VOICE V",
" TO T IN MS",
"ARP.RPT V N S",
" SET VOICE PATTERN REPEAT",
" FOR VOICE V TO N TIMES",
" SHIFTED BY S SEMITONES",
"ARP.DIV V D",
" SET VOICE CLOCK DIVISOR",
" FOR VOICE V TO D (1-32)",
"ARP.FIL V F",
" SET VOICE EUCLIDEAN FILL",
" 1 FOR STRAIGHT CLOCK (1-32)",
"ARP.ROT V R",
" SET VOICE EUCLIDEAN",
" ROTATION (-32, 32)",
"ARP.ER V F D R",
" SET ALL EUCLIDEAN RHYTHM",
"ARP.RES V",
" RESET VOICE CLOCK/PATTERN",
" ON NEXT CLOCK TICK",
"ARP.SHIFT V X",
" SHIFT VOICE CV BY TT PITCH",
" (E.G. N 6, V -1)" };
#define HELP13_LENGTH 53
const char* help13[HELP13_LENGTH] = { "13/13 JUST FRIENDS & W/",
" ",
"JF.TR X Y",
" TRIGGER CHANNEL X (0 = ALL)",
" WITH STATE Y (1 ON, 0 OFF)",
"JF.RMODE X",
" SET RUN STATE OF JF",
" (0 = OFF, NON-ZERO = ON)",
"JF.RUN X",
" SEND X TO RUN INPUT",
" (V -5 TO V 5)",
"JF.SHIFT X",
" TRANSPOSE JF BY X",
"JF.VTR X Y",
" LIKE JF.TR WITH VOLUME CTR",
" (V 0 TO V 5)",
"JF.TUNE X Y Z",
" ADJUST TUNING OF CHANNEL X",
" SET NUMERATOR TO Y",
" SET DENOMINATOR TO Z",
"JF.MODE X",
" NON-0 FOR ALTERNATE MODES",
"JF.VOX X Y Z",
" CREATE NOTE AT CHANNEL X",
" Y = PITCH, Z = VELOCITY",
"JF.NOTE X Y",
" ALLOCATED NOTE SEQUENCING",
" X = PITCH, Y = VELOCITY",
"JF.GOD X",
" REDEFINE C3 TO GOD NOTE",
" (0: A=440HZ, 1: A=432HZ)",
"JF.TICK X",
" SET TIMEBASE OF GEODE",
" 1-48 TICKS PER MEASURE",
" 49-255 BEATS PER MINUTE",
"JF.QT X",
" SET QUANTIZATION",
" 0 = NO QUANTIZATION",
" 1-32 SETS SUBDIVISION",
"WS.PLAY X",
" SET PLAYBACK STATE AND DIR",
" 0 = STOP, 1 = FWD, -1 = REV",
"WS.REC X",
" SET RECORDING MODE",
" 0 PLAYBACK ONLY, 1 OVERDUB",
" -1 OVERWRITE",
"WS.CUE X",
" MOVE TO CUEPOINT (RELATIVE)",
" 0 RETRIGGER CURRENT CUE",
" 1 JUMP TO NEXT CUE",
" -1 JUMP TO PREV CUE",
"WS.LOOP X",
" SET LOOP STATE ON/OFF" };
////////////////////////////////////////////////////////////////////////////////
// Help mode ///////////////////////////////////////////////////////////////////
const char** help_pages[HELP_PAGES] = { help1, help2, help3, help4, help5,
help6, help7, help8, help9, help10,
help11, help12, help13 };
const uint8_t help_length[HELP_PAGES] = {
HELP1_LENGTH, HELP2_LENGTH, HELP3_LENGTH, HELP4_LENGTH, HELP5_LENGTH,
HELP6_LENGTH, HELP7_LENGTH, HELP8_LENGTH, HELP9_LENGTH, HELP10_LENGTH,
HELP11_LENGTH, HELP12_LENGTH, HELP13_LENGTH
};
static uint8_t page_no;
static uint8_t offset;
static bool dirty;
void set_help_mode() {
dirty = true;
}
void process_help_keys(uint8_t k, uint8_t m, bool is_held_key) {
// <down> or C-n: line down
if (match_no_mod(m, k, HID_DOWN) || match_ctrl(m, k, HID_N)) {
if (offset < help_length[page_no] - 8) {
offset++;
dirty = true;
}
}
// <up> or C-p: line up
else if (match_no_mod(m, k, HID_UP) || match_ctrl(m, k, HID_P)) {
if (offset) {
offset--;
dirty = true;
}
}
// <left> or [: previous page
else if (match_no_mod(m, k, HID_LEFT) ||
match_no_mod(m, k, HID_OPEN_BRACKET)) {
if (page_no) {
offset = 0;
page_no--;
dirty = true;
}
}
// <right> or ]: next page
else if (match_no_mod(m, k, HID_RIGHT) ||
match_no_mod(m, k, HID_CLOSE_BRACKET)) {
if (page_no < HELP_PAGES - 1) {
offset = 0;
page_no++;
dirty = true;
}
}
}
uint8_t screen_refresh_help() {
if (!dirty) { return 0; }
// clamp value of page_no
if (page_no >= HELP_PAGES) page_no = HELP_PAGES - 1;
// clamp value of offset
if (offset >= help_length[page_no] - 8) offset = help_length[page_no] - 8;
const char** text = help_pages[page_no];
for (uint8_t y = 0; y < 8; y++) {
region_fill(&line[y], 0);
font_string_region_clip_tab(&line[y], text[y + offset], 2, 0, 0xa, 0);
}
dirty = false;
return 0xFF;
};