From 59e6b969af3d58c906273e146a877f6a6fe6de47 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Tue, 2 Apr 2019 21:52:02 -0400 Subject: [PATCH] Add the ability to interactively play music with a "tracker keyboard" --- jopl.c | 32 +++++++++++++++++++++++++++++++- jopl.exe | Bin 61436 -> 62531 bytes jopl.jor | 19 +++++++++++++++++++ jopl.prj | Bin 4334 -> 4388 bytes kbd.h | 1 + 5 files changed, 51 insertions(+), 1 deletion(-) diff --git a/jopl.c b/jopl.c index e38234e..f36fe75 100755 --- a/jopl.c +++ b/jopl.c @@ -1,3 +1,4 @@ +#include #include "jorth.h" #include "adlib.h" #include "kbd.h" @@ -24,6 +25,30 @@ static void f_quit() { DONE = 1; } +struct ffblk findfile; +void f_findfirst() { + int result = findfirst(TOP().s, &findfile, 0); + if (result == 0) { + PUSHS(findfile.ff_name); + } else { + PUSHU(0); + } +} +void f_findnext() { + int result = findnext(&findfile); + if (result == 0) { + PUSHS(findfile.ff_name); + } else { + PUSHU(0); + } +} + +void f_keyWasPressed() { + int k = TOP().i; + TOP().i = keyWasPressed(k); + consumeKey(k); +} + void do_repl() { char buf[128]; @@ -35,7 +60,12 @@ void do_repl() { CDEF("quit", f_quit); CDEF("adlib!", f_adlib_write); CDEF("adlib@", f_adlib_read); - + CDEF("findfile", f_findfirst); + CDEF("findnext", f_findnext); + CDEF("key-start", kbd_init); + CDEF("key-end", kbd_cleanup); + CDEF("key-debounce", kbd_debounce); + CDEF("key-pressed", f_keyWasPressed); f_loadfile("jopl.jor"); ontick = f_lookupcp("ontick"); timer_setcallback(timer_callback); diff --git a/jopl.exe b/jopl.exe index 1c59a48e1a67af5a062d67e0ac9696b27c49b3c8..e7ebe61cd13e54b6175ddbe1bcbf2be2d1de3202 100755 GIT binary patch delta 10612 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 delta 9644 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 Y%v`_yJY4A-cKH*5kG$H(ZP%{-4`kZUQvd(} diff --git a/jopl.jor b/jopl.jor index 9a091ce..2f6c6b4 100755 --- a/jopl.jor +++ b/jopl.jor @@ -146,6 +146,25 @@ var t2 : ontick adlib@ 0x20 & if startt2 player then ; +: files findfile begin dup while yield findnext repeat ; + +: keynote [ inline| +44 b, 31 b, 45 b, 32 b, 46 b, 47 b, 34 b, 48 b, 35 b, 49 b, 36 b, 50 b, +16 b, 3 b, 17 b, 4 b, 18 b, 19 b, 6 b, 20 b, 7 b, 21 b, 8 b, 22 b, +23 b, 10 b, 24 b, 11 b, 25 b, +|inline ] 0 29 for dup i + ub@ key-pressed if drop i 3 + rdrop rdrop ret then next + drop 51 key-pressed if 15 else 0 then ; + +: keyboard + key-start begin + key-debounce 1 key-pressed not while + keynote dup if octave @ 12 * + noteon else drop then + 78 key-pressed if 1 octave +! then + 74 key-pressed if -1 octave +! then + 41 key-pressed if noteoff then + rest + repeat key-end ; + :noname default startt2 diff --git a/jopl.prj b/jopl.prj index 8d074c1822a8d0f0cf5ebe977612e2053a2f98da..8b08d4ca9e2b2a410ebd7575286f8335d1acdf6c 100755 GIT binary patch delta 320 zcmaE-xI}4#Ivewy)lHkV*i6`&-B&kFPUOAJFUD|db(5bg69dCc1_p+($ZiWoT&x}_Yw=gbeoXN<|`2T+&qdj9IV+rF1h8l)w#_J3QK*+$r!@$OH z4QLW8g91m4*kl2IsRS_~SCFBvu-@F`*cPC5|101epbW$y7m)bkrLKO#u0fuTJ|LdRqB=h>|DX_$ W$qoWilPv`_SuS_f`%O+0=l}qJpI|Wn delta 305 zcmZ3Y^iFYuIvX=vXZ>a^HWPN{l=;b%6L~N53o&Sw)%$&6U|=u=VvEVneDV7HOkzOx zXU1oYrx^eL|IDzLaXw=mVzuwQ$W%7FdxO$KlFaH1^ zJ!hbO91Oe+K5HzXx{>w$|IZ&X8)N_yF- zOo0nX9Au`qlMB#}{~!?T8szEd1CkKo0=m`9KPbdQ&tq~Nzxd=l0WB7glF4%fIsiHG BUfcix diff --git a/kbd.h b/kbd.h index 624a7b7..6061ef5 100755 --- a/kbd.h +++ b/kbd.h @@ -6,6 +6,7 @@ extern volatile char kbd_triggered; void kbd_init(); void kbd_debounce(); // call once per frame +void kbd_cleanup(); unsigned char kbd_wait(); #define KEY_OFF 0