From 98f45b33dc7ef602656ce7163dfc7f0b2327fde5 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Fri, 24 Oct 2025 16:41:12 -0700 Subject: [PATCH] Take 2 for PCM playback --- src/libsrc/apple/sndseq.pla | 26 +-- src/makefile | 10 +- src/mkrel | 6 +- src/mockingboard/bells.pcm | 202 +++++++++++++++++++++ src/mockingboard/hello.wav | Bin 5068 -> 14982 bytes src/mockingboard/wave2rlepcm.c | 70 +++++++ src/samplesrc/{playwav.pla => playpcm.pla} | 34 +++- 7 files changed, 320 insertions(+), 28 deletions(-) create mode 100644 src/mockingboard/bells.pcm create mode 100644 src/mockingboard/wave2rlepcm.c rename src/samplesrc/{playwav.pla => playpcm.pla} (72%) diff --git a/src/libsrc/apple/sndseq.pla b/src/libsrc/apple/sndseq.pla index c5b7207..98e53a0 100755 --- a/src/libsrc/apple/sndseq.pla +++ b/src/libsrc/apple/sndseq.pla @@ -315,45 +315,47 @@ TONEXIT PLP INX RTS end -asm a2spkrPCM(samples, pagecnt)#0 -PWM_DIV = 3 -PWM_DLY = $100/PWM_DIV +asm a2spkrPCM(rlepcm, pgcnt)#0 LDA ESTKL,X STA TMP LDA ESTKL+1,X STA SRCL LDA ESTKH+1,X STA SRCH + STX ESP PHP SEI LDY #$00 PWM_OUT LDA (SRC),Y ; 5 - STA $C030 ; 4 LSR ; 2 LSR ; 2 LSR ; 2 - ;LSR ; 2 - ; 17 + LSR ; 2 + TAX ; 2 +PWM_REP BIT $C030 ; 4 + LDA (SRC),Y ; 5 + AND #$0F ; 2 end asm pwm_on STA ON_BR+1 ; 4 ON_BR BNE OFF_BR ; 3 - !FILL 31, $EA ; 15 * 2 NOPs - EOR #$1F ; 2 - STA $C030 ; 4 - ; 43 + !FILL 15, $EA ; 15 * 2 NOPs + BIT $C030 ; 4 + EOR #$0F ; 2 end asm pwm_off STA OFF_BR+1 ; 4 OFF_BR BNE ON_BR ; 3 - !FILL 31, $EA ; 15 * 2 NOPs + !FILL 15, $EA ; 15 * 2 NOPs + DEX ; 2 + BPL PWM_REP ; 3 INY ; 2 BNE PWM_OUT ; 3 - ; 12 INC SRCH DEC TMP BNE PWM_OUT PCMEX PLP + LDX ESP INX INX RTS diff --git a/src/makefile b/src/makefile index 42e33b0..3372213 100755 --- a/src/makefile +++ b/src/makefile @@ -48,7 +48,7 @@ FPSTR = rel/FPSTR\#FE1000 FPU = rel/FPU\#FE1000 SNDSEQ = rel/apple/SNDSEQ\#FE1000 PLAYSEQ = rel/apple/PLAYSEQ\#FE1000 -PLAYWAV = rel/apple/PLAYWAV\#FE1000 +PLAYPCM = rel/apple/PLAYPCM\#FE1000 SANITY = rel/SANITY\#FE1000 RPNCALC = rel/RPNCALC\#FE1000 LZ4 = rel/LZ4\#FE1000 @@ -129,7 +129,7 @@ $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX $(HGRTILE) $(HGRFONT) $(HGRSPRITE) $(HGRLIB) $(TILETEST) $(HGRTEST) $(GRLIB) $(DGRLIB) $(VBLANK) \ $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) \ $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) \ -$(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) $(PLAYWAV) $(CONIOTEST) +$(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) $(PLAYPCM) $(CONIOTEST) -rm vmsrc/plvmzp.inc @@ -443,9 +443,9 @@ $(PLAYSEQ): samplesrc/playseq.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW samplesrc/playseq.pla acme --setpc 4094 -o $(PLAYSEQ) samplesrc/playseq.a -$(PLAYWAV): samplesrc/playwav.pla $(PLVM02) $(PLASM) - ./$(PLASM) -AMOW samplesrc/playwav.pla - acme --setpc 4094 -o $(PLAYWAV) samplesrc/playwav.a +$(PLAYPCM): samplesrc/playpcm.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW samplesrc/playpcm.pla + acme --setpc 4094 -o $(PLAYPCM) samplesrc/playpcm.a $(GRAFIX): libsrc/apple/grafix.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW libsrc/apple/grafix.pla diff --git a/src/mkrel b/src/mkrel index 1cd39c5..76a4a02 100755 --- a/src/mkrel +++ b/src/mkrel @@ -93,10 +93,10 @@ cp samplesrc/LEVEL1#040000 prodos/demos/rogue/LEVEL1.TXT mkdir prodos/demos/music cp rel/apple/PLAYSEQ#FE1000 prodos/demos/music/PLAYSEQ.REL -cp rel/apple/PLAYWAV#FE1000 prodos/demos/music/PLAYWAV.REL +cp rel/apple/PLAYPCM#FE1000 prodos/demos/music/PLAYPCM.REL cp mockingboard/ultima3.seq prodos/demos/music/ULTIMA3.SEQ.BIN cp mockingboard/startrek.seq prodos/demos/music/STARTREK.SEQ.BIN -cp mockingboard/hello.wav prodos/demos/music/HELLO.WAV.BIN +cp mockingboard/bells.pcm prodos/demos/music/BELLS.PCM.BIN mkdir prodos/demos/net cp rel/HTTPD#FE1000 prodos/demos/net/HTTPD.REL @@ -153,7 +153,7 @@ cp samplesrc/sieve.pla prodos/bld/samples/SIEVE.PLA.TXT cp samplesrc/test.pla prodos/bld/samples/TEST.PLA.TXT cp samplesrc/testlib.pla prodos/bld/samples/TESTLIB.PLA.TXT cp samplesrc/playseq.pla prodos/bld/samples/PLAYSEQ.PLA.TXT -cp samplesrc/playwav.pla prodos/bld/samples/PLAYWAV.PLA.TXT +cp samplesrc/playpcm.pla prodos/bld/samples/PLAYPCM.PLA.TXT cp samplesrc/rpncalc.pla prodos/bld/samples/RPNCALC.PLA.TXT cp samplesrc/fatcat.pla prodos/bld/samples/FATCAT.PLA.TXT cp samplesrc/gfxdemo.pla prodos/bld/samples/GFXDEMO.PLA.TXT diff --git a/src/mockingboard/bells.pcm b/src/mockingboard/bells.pcm new file mode 100644 index 0000000..530f89f --- /dev/null +++ b/src/mockingboard/bells.pcm @@ -0,0 +1,202 @@ +™ˆ÷÷G¸©øh÷—øÈéøøøX©¨÷÷Wø¨‰(×ø HÇ8iJ[:)(gVw(; +C$* :)(KG() + .  +#*K;L; Ey·)J 3Z * T˜G( +lYE¸():$ + / + 67hUiD(I:)XÙ +9È9JGVG&$  l F +K9h)J6%$8ev  l +5y7 +  + $Egv')¸©8ùI(UVet M + F()f + .  +W&%V&f'+jI(™˜);, + #6Bú*)6'‰*L + f§6…i*û U ++, v%3$&GF +Xij U «, + v%$# k*©HWf)*M ED##:)‡(*;& Œ+ ((A(Ijˆ*Kz9H; + ö%2() +9Hk:)WÈ)J 6%d):+*G +K*(w8y7( +  + 33H§z9(J«*{ + xU + , + X *;J)h9*<  @(‡H)98I) +  ++, + &gf*L ( *8I5;$$Æ ;876 +; 5 ++|87&55+ + + 'J)E + >  )(7C#" Z8'& + ,+ù  = +wa +   X +[Ix);W&µ$c +K989H9Z 7&G8™J[ + R  - +G8Y8 (W* W kcw((&5 ;œû b#Y()+7()*« W™ '):ª)*K:9ˆ*&vEy;,;*e*&Š+ + t5F7  <+ +28\Û+ %t%65 + -  +65*[Œ+)82U$%'89*59- )*;'FG2 + N ,  + $Š9Z„85&G +-  ¶% ++,= +ˆ–GV + M + %TG + M,;*5X$5 JFg&U  -� %”5$‰7 Z(+y+L +dv2'8 + M:Õ + ? + &W4H7j9 +9H9Z  +,«'&uV'(*+%W2 + �  +8§3HV(Z– _ +VP +&%(‰*I8 + -ºb'(9\:K 3 + <9¨y;'896Ef'8 ?   B +K*I89 +1z]j6E$5&GEY'UV + ~>. + P8(Zf)j‹J)X *+ + 2%†G89[* 8'f) +)' + - +¥:YHIZI$ + N + C'(K B#:K ?,  EW$‰H'F'Wj+. + %4b3$ + +%$% +l+*;,9HV2# + � + 'h4 +L + Tø8 +K + '†'H%$% +Œ[Š C +< +&ed%(i + N ©*¤G&6¨76 +  K* ( + < w: l + E(Gº{ + T ;{ +'†Ç['; +t%V(i8 +  +4·8)* $£ + n-¬ +'v7Tg(: ++Œ-N +""#45f7ˆJF +\+ºx'%”˜) / + 5ö)J9('&%4 +L +W9H7¶E67X) >  +)(y(U)Z'F%T© + ? 'h%$C$…(Ixi(' + � +$“$%v  \ +Hz E +, + Æe&'6L + hiD\ + U(9H += + E(uT lkz4H&&7–7(w +  j[ S$÷'kVš«‚#):)x +  + F +;ˆW(D%& +[j;l + %´%89:IZU +L + %6gF6G78i> + vGhwXg6… +[** ] + dõ%FW8™\;)7 + , ,  Ay + ] &iXG&g˜&E&wˆ) +\ $'gV +++(gHyJ+< + %DCh7&  ,m +)()(¤I&u(‰*,N )X¦%DEZW[ +GhK(FEA + > + G8)ˆiè&5'8Y'& =<Fe$C [ + ' +[ +%(9J9&%$$x)[JY|3(YwH' / ;:8g†3$%&f +LHY: Z)Xx(B +‹œ +¦wi4)*6*''k$#$:IJ;*xùy(5&'C + + G + MI8'“%)*)% ++Œ-,(w&U(3 + - é'&'‰()(&5T%¦  M +HG&Y('V95 + \ +W)Ê)2#% + -  + w8I +Y('6%–u ZW +MIzd%&ˆf©89Œ + 456g¸ +  . + V'9Z)Eö' + -,*9¸7VE)(vZ)w9*)(8yH# + ]+)™x*K "(v *[J+L*9D3$g¦ ; XM +¨(3*)5+LK*58H982  ,+išVYUjù9()jYHW&¸  ,-,  5) +IeG&E&;*IªË +EÆe: f'›:é„%fE'8y:;,+Ji(E ** 48Y:»*&E&X–Ixyø˜* #H6 *[,K:iX)8W¨S™ÚK + &7(1 ZW(™*l;:IUh&U&'*K:9X)J5:UX$ *z;*)(Ç65:)(G()*{g * *UW + \*J;*(w&E6X4'ØKŒX)JCX%ZGH)*«%wTÈ«*)7:E*)w(ùj™8#i(8)J9878):)'†': #$‰+|[98wI5%X%*kj‹*dE66$)ªYJyZùCi8G*+J9ø8'f'¸'VGø9J;: Uw6% +<)(K:I8·vEæ7()M, VX&%DYE&J‰*+,- +Hçö7øij'' +   + $45–K*x9:*†GøX‰(WL + &%&'('D9zù8'7I +9u7ˆ% =,Jk DI('6%vWX9,-, +ghSiˆkG;* G(8&•{g9 +977ˆ7v'(i(v +[*h)*øi*+,+G** &eÆ%6(IJ‰ + ] +3¶G8)(fg( +M  X):)('–G¦'KF Kg(I5$…&(ú;f*%6'8ù)*+*WK „5V')Jù ˜)Jv'xe&GH)h)*+M )xWeX·v'[Š[* $W&ED):kIxYx)Z('–gè)L  5()('f'x×(é8'(š'v%D%&' ++<+*(( +L+ +'‡uF‡fH) +lJ9ˆ'%D5h—X)*˜) + = +wh7&Fw¨9º&&*+6Uö <x™E'h‡(9ª)XIªV‡6#*;*‰J9HW*)'u&x7vjû;U'H'V&(I(g(k98‰(„9(g(+,+·ø™%% +{:ù('f×–'j'&7)z¹H'&%4%'hg + ,=, H‰˜'ö¶'©H \+ +'&5ö6yV' +[*ù©8†÷);(7Hy(WG(I(&u(9H9{)8wF·v+*‰šh9z5d%&'wH)*:y*98ÇØ'%5) +)(( +L;y9G6e'(9(f(Ùš(§6·&4 +L +hY(—ø·(‰87(+Jix'6Æy('&Z9ˆ9:9ˆ'FÅ&7 [y*+<h§Gæ''f +\)iHGö÷89:)W:K*hØ7f'(ih**)'F'(IX7Æ7HW8iZyz)4E&'X h)z¹k(—X'6ED(9ZYz)ØY¶7h'–(ºË +'&‡xG–'(‰ˆ™x©T%(IˆIŠ9˜÷ø(GXIzùIöFEz)g(y*ÉH7f%67vg ++l;*X‰8'f'87¶'ÈIJk('–÷'È7X9Z)8g(;*7¦w8)z9ø‰'–'hGgèI*k*(÷&e&8‰:K:ù9ZID%&'8'V'8Yú)8'Ey(%6ÇX)J ºI‰(e()¨78ù XYh·'… *{J)ø8—X7F')J)¨9š:98g•&'hwH9JI8ˆZ)GÆu(‰Hœ+ +GV78÷'V6)Š:)87H)(&%V×;*‡HIZ9ø8G&7È)*;:9X7FG˜&%&÷89I(ij :)'d67x9Z9()ú)H—x&%$%—8)ʹ8ç6GH8¦'(y:[jI(—h'66():É8w8©H7&eF'Ø9J;J9HW6WGèW(9jùÙ(G6Õ&Z)(g(9ª)˜÷w6e&\[:‰¸W&ç&G8HW8:;:8WæWÈ8)Š9(§89z)–w89ªx9I(Æ÷˜—()‹:)xG†•&'(új9H)j)'6%6§¶789ú)(WV7ˆ§gøùÊ)6VWøH騷˜'…&Kй8÷&5&'(iZ)Ø[JYH'u&Çf9š)¸¹˜6Uf—8©*;\ ÷‡˜WF7(Yj)¨)˜WVU&'9ªI(g(‰8g89H—Hw()zK*9Hçög8Yˆù*{ + T%¶88yJ{J98ghI(¦5&'8ù Z9øEH)x÷89ºy˜I8'&EF')*[*)8Gø)8u7øHi:k)HG6e&'øX¹J98i +™X7%T%'()˜)x9Š8Wˆ'xW&u)*‹j©8÷'v(yøh)J9(7Fwv7h'H)J;:)'&WHiH÷G(©Hyê)%$5F·ˆwH)*;Jiø'&µVú‰:¹('†8 HG†wHk*('f7˜÷'XÉØYºe&'øIZy*987†7HwF67(YÊùx'6¥&)z)¸iú)÷gfU&)šIX)øxWvW8§8)«J)(7F÷xwH)z—XYXGVu9š9HÙxGF7øwÈ)*{ø(&ÕF78¹X7(*kJfV·67(iJ+L+f(YH·F‡ˆ9HùI('Æ'8YH'ˆy8É87():)'FU&'(*k:iøX'&ef'¨w8)úZ)5F·F7(iš9ˆùY('&u6Gh§()[)˜WG8i('¦G(*+*™jIH—F5&9 +¹8'H™H÷§8'f'89*;;F'Èw87F'(II¸)*‹)'v•7·ˆYš)(G(JöV'(ª©ª)†Wø7f7(¹J)'F'ˆ'†Ghij)ø9Z97&÷‡ˆ)‹:I('&U&X7&U'ˆIùj™(%dùhIzù8wH)(45'(9z)¨yx·V'8YH·*‹:)8wv7h—89J+:)(G6'¨·FE&(IJ9X)ʶ—HI8Ç(ê)hI*)åVGZ)È)š(÷—vw(:»*)'F(IH'fH øXw89z'6U6Gø˜IJ¹(wHI +9u8™ú)8‰(%d%(I(×(ú*987FWH'&e)k*yèY*I8'6Fw(WV):JI8÷'(I(WV'()Z9h¹Z987…6'*;:889*Y8ÇvWXWv'( ++;*Iø‡†Gȉ(g)L(‡ö¶g()J;J'&'8É(&E6wHIj©*;¶GHYˆW¸©8w89h7…)š¹(g+*'–'ØG6')*ëvF‡Ö'J9(8)*©JI…&7HYh8*KJI8×(9*9(&E$% j9¨Yø'&5&'h9*)(g8)zù87&‡F§+L+ '&G˜·656g8™8W +l +ö7ø(w8)š)xj9H'¥FWh©x*+†'8iHG–')*;L '&7H)X7–'(9j9˜V'j6%F÷˜)ú:)(7G(™Æ'):9XIúJ)S'8Y8—HIÊ9X‡ˆGÆK:Ùø)8§X)H'&5&():;*)8‡6Gˆ‡F7 *[*)(g9*¹8'•&zéŠ)'Æ÷—V'9ªˆ)j)('&u7H)Z9X‡‹)(7&GH7ö67*{ÇHI8÷ø8É:;:(e&(IX'ˆùY'fG(I +9%D%&)ú9hù &E&(Y8f(y:kJ9H×F¥& z)x'XYJ‰('6%6'(i'&'()ZKJ)(7f7(É&5'(YøI*IX7ö)J(W()ª9˜GÈgv5&  Œ‡È'ö&G(y(—{J)('F÷WèIz(W8Iš'&E–WHI8G(*K*('&e‰H÷()k)øxF56'ùi(gH¸'†GˆE&IZ‹)(76'(y8'&E&(‰HYH9JK:)&E4%&x7'(ù9˜WH‰87&UšYxù (7†W(j&U)zy8÷Çv'(*k*)¸é(§†78Y¨+\'&u&7˜W–'()z)¨Yz'æG8IJ9(G()jYX'øGæG(*;:)(‡HY(&E6(9ÉHG()*k*U6Gˆg8ÉJi(Gf'(Y('6U&'ÈÙú9&E6')*)'†()úYøX&d)ŠYø(™XG6G(Y(·(*[*9X÷X9('f9Z9('6G()Š)'6µ¹˜):[:)(÷Wˆ6F'*[Z‰™(&e†'8yH'F'(*[:(wø‡v'(*K:98—j)8GÆWØ'8Iª&E6'¨GØ9Š)ø9:9D%iš)ø©'&U&'(9(7Ö'*›:9HW¸'&E(©ø9ê)('6E&h'vG8):;*)(GVWHj U&9šI¸©8gF6'9 +IX‡8ÉHGH8×6u{*Y˜9J9(g¶'(y8‡(*+\ –'vW(‡&'()*9ø)Š(÷wX9¸Yºf'©(WVE& *K*98w8i(&u&HYz9¨iz)7f'h'f7xI:+J9(76GHY(u&øWH9:›* %%y(ç8iziøˆ'…&'(É8yø§V)J)(7V'):[:)÷¨'–)Š)§H©ˆ'u67ø):›*(gøHg†'Š9¨);*'&µ'(©(7W8)Š(wXIh÷7(Ê)(g(‰H÷è§89:[u&'x÷8)ú9‡)J9(eV7(ù™H©'&U(98G¦'(©zIXÉ'e&'(9Z)gH‰š9(&%&'h‡V7)ªI8Gv'8Y(ÇH9J9¸)z9hG&E&™8‡8)Š)(‡x'˜'¥&*k*)h)zˆG–7(YH§(){÷Ƕ'8Yy(Vz9X‡&W8iø9*K*'vGøWV7HYZ)(W(9)•6W()JYù Š)('f'˜w†()ú +)'V'i'¦wX H—(Iú)'V'¸×()zYøX9*)&eF7(¹¸™˜7&E&)Z9(—)ª9Øwx'–7(9z9(w()J)ˆW¶WHgG(l(÷È7†'8Yj)(G(z)(7öGHøX©(‡X™hgF7(Iºw©('–gHiX·()*;:¦×VW()ú:)H'HI +9(¦gøh‰š)('&56'8Y865&8ùYˆIJ)Æ'(éÈù H÷˜7v'J J9xGV'˜7†'): J)8G8)º9('Ö7X98w(9z)ø'¸GFe&'(IJI(Iº9(7†7xIX·[*)HLjg–78YZ)(—h‰XÇøø)[*(G&g¸WV7Xù (G8IJ)&545'(ùéš)(çÈ7v'(™zIH7X987¶'(Y8×X9Z :)(—ø'V')šyh—(y8'6E&'™ˆùY8&EFGHyHW(::9ˆIøGvF')z)878ù)87v÷wV'+ ;*Yø˜÷X©(g()ZY8G–gøX'8)j('f7H™XçH)š)¨¹('Æ'8ø¸)Š)(÷‡V%6(Iú9¸©8G†'8)h7ÈIª–GÈGFGøøÙ8'–'(™xù‰8GFgÈ7v'(: JYX÷×v(š)¨ùY8÷÷w8)Š9XgøwÖ'(y˜)ê)(7†7Hyˆg8)ZIHwØGv§89Z)8‡ø×xøˆ)J[*)G&Wˆ7†7ˆÙØÉ('&…&GÈùªI(·Hi(7FgxéÈYhG6%&'(y8·˜ÙˆgÈ7F'(9ÊiX7ø(G–'(iXX©*Y(7æ7ÈGH9Šy¨©Xw¶'(‰¨ùH÷G˜G†)ÊI¸IH÷GH)j)(gHÉ8÷·ÈH9ZY8GFW8I8—ØI:iXYj9('6E67øØYZIx§h7656GX9ºIˆyˆWG89h—˜IZIHç˜'VG8‰ØGHéX'v'8yxyj‰8·FG˜7V'8ùIø(gö'()Z9¨yjIØ×8Wf'()šIX7ø÷6GH)h7H9ª)(÷WøxIZIX§X)H7v·8Y*YèIH7v7øø(9ÊIø87¶7héèÉ('–÷WˆYÊ9H§8iH·øøøH'¦'øø‰øØ)H7f'(9ÚYøH‡¦78iˆh9z9Xg¦g(§89Ši˜ÙˆwVGø˜Ij)(÷g¸GF78i:Y¨yX÷789J¹ÈY8÷(÷‡HYzI8Lj÷'XÙx™ª)¦÷øù9Xw¸7ÆW8ùù IH'V'8™h‡hɈ·ˆWfG8éX'ø898G&WøXiÊ9hWvW8÷H騩hWFE6'(é˜IZIøø(GVGHY*YøH÷—øè9z)8§H‡øYÊ)(·¨÷gHù Hé('–WøèyŠYˆ‰(FvG8Éø©8'fWˆ÷HYºI8—؇xÉø¸)X'–Gèxù¸§Øg&W8Išù9xgÖ'HI˜XI:YÈ÷‡FG8IŠ9¨É¸×øwH9j98÷W˜·xÉÈ™HÇg8ùùY8Gf‡x÷ˆYz9(w¨G†gHù ˜Yª)(÷×&G8ùYH‡ÈwVWø8ù™87VWH™è™ø—˜W–7(ùøø÷ø78):;Z‰8÷—6wHÉÈÉXg–gøh)Š9ø¸)h÷H©ØIxw†Wx‰h'H9J9HwX÷gXiÊ)8w¨—VwøèIj97–‡ˆghù‰˜©(G¦WØÙ©8W§ÈÇ8ùiHWØ×(IZYø˜9HGf§xwH9jY¸·¨÷8ù‰zy87ÖWøGH9:YØw˜gfG8IZYˆyøWø¨w89J9H÷÷—XYZ9HWH™HWVgˆù™Z9(7†÷׸ùøXW¦'X™ )˜iz9H—¨gVW8ù98·¨wgøxù‰H÷øxi:iˆÇØ7¦'(ÉHù9xWvWø7HIÚiˆ÷–G(¹øY˜÷GèW89šIH‡ø¨—8™øèW–—X™ˆÙH§¸÷x9Ú9øXW¶7øøIZI(÷÷'¨™*Y¸©hW6gøXùIHG†GÈ—XùIøÈWF7(9jÙøx÷w(ç8Izyè÷ç(Éh©zY87ÆGÈGXéh—ø÷7(ÙXÙˆÇèIx7XÙH÷‡F·89š9ø¸÷G¨ù)ª98WF÷§Ø©È¹H7–GøØù)H‡Ø÷ˆéh÷—6WH™Øù)xggøhIªiHç˜g†GXYxùYhWvWøˆ™JÉ触7(©ø(¨÷GøgHijIXwøøXÙøYXWÖgø(‰:yHǘ÷XYª‰8ih7¶wøèéX—ˆ÷xù)øyH×øèÙx7–G˜WˆùIøÈWVG8ùùYX§VwXçXùIè÷FGHùX™*ix÷7X§HùHÇø(×H騹H÷7X™ØùX÷‡¦g8YZ‰˜iXG6×øxIÊI8÷÷w˜™ø8yH÷7øXùIx‡øÇˆÙøˆg¦GHùxéˆ÷˜WXišy¸÷7vgø˜iJYhw6gÈWhYZ‰ø¸gfGX¹øˆ÷gøÈùø˜÷Xi:iøYXWægø(iŠIH÷÷G˜ùùY87–—øè¹X§øçHùYø˜·øøéhWf÷wXYzYøø7vGHùùyhWv÷çXù‰è÷7xÉxùˆÇ¨×XY:9H÷gx·xù ˜™ˆ÷7Øù¹XwhǶGHùùY8w&§ø¨‰Š9h÷÷7øøø8çø¨ùi8·øXWhùÈ'ˆWÆWHùùYx×H÷hIйø‡†wø¨ù9X÷ø¨ù)øè÷øÈih÷‡ø¸‰ +yøx÷gHy:yØ ˜—v÷7˜yjYø÷wxùù‰H÷WøøihÇø·xùiøH÷ø¨ùIXg6÷ÇHYz‰ø˜÷7hIXù©X÷÷—˜yøø÷7XÉHù ¸Çø8˜Ù¨÷÷'˜ù hÙx÷Wø8™ZYˆ÷‡†‡xùéh÷7ø¨ù9øx÷Gˆ¹h7ø÷'øxù‰X÷W—xùyøHWöGøù©X÷˜§Xù©ø÷—ø¸yø·˜—xY:™øÈ÷ˆ™ÈYˆ‡–—ø8ùIø˜÷'xùù9h‡F÷çXYZiè÷—¨ù x™¨÷øÈ‰h÷اxùyxIˆ÷7ˆùù9x÷÷WXù©ø÷'ø¨ùiX÷÷wøøøX÷ˆùéˆ÷øÈùÈ÷'–gXùù™h÷wø(iJ™È÷÷Gø8ù)X÷øØùøÈ÷˜¹ø8÷—øXù©È÷ÇXùiøxWÖ‡Øù™xç¨g˜ùÙØ÷Gøøø(Çø(WhIj™ø8÷wx™(Éèw–ç¸ù‰øx÷WXùù9h÷÷Çhùø8÷Èù9Iø8×øøÉh÷÷g¨ùù9˜‡&—ÈùɈ÷wvgxùé¸÷øÈùI¨÷÷øøøX÷xIùÉX÷—ø8ù9øÇÆgHùùY¸÷טùYø(÷×ø˜É˜÷ø(ùy¨7È÷ȹøh—f—øùé¨÷Ljù‰øwv÷7˜ùi˜wÈWØùøÈ÷7øøø÷'øˆùÉÈ÷—hùù)ˆ—¦÷xùyøh÷Wø8ùIh÷÷—ØyøÈç˜ùyø8÷—øHé¸÷÷'˜ùù‰X÷‡øù‰h÷÷‡˜ùiø·ø¨ùø·Hç˜ÉøX÷·¨ùù¨÷§¨ùiø(·¶gØù¹ø(Gø7˜ù9ø÷Çøøè÷gøù‰ˆwX÷G¸ù øXW†ç¨ùù)è÷g¨ù™Ø÷÷GÈù¨WøøùIø¸÷7øXɸ÷÷Whùù¨÷‡˜ùé¨Ç6÷7ˆù©øˆwøèùx÷÷ø8™ø˜÷7¨ùé˜÷ÇøùI˜÷7F§ˆùùyX÷§èùix÷÷GøX™ø8Çøù‰ø÷÷˜ùø÷÷¸ù)J©˜÷ǨùIø÷6·øù9øøøxéøH÷§øøø÷—Øù™è÷§ØùIø÷÷¸ùÉøH÷'Øù)ø÷÷øIøˆWø¸ù¹øX÷WøXù¸÷÷˜ùù9ˆ÷—øù9Ø÷÷Wxù)øøøˆ9ˆÙ¨÷×øÙø8÷§˜ùù9h÷×øù9Ø÷׸ùù ¸—ø¸ùYˆ÷÷'øx)ø¨÷ÈùÙØ÷÷˜ùiÈ÷çøùùx÷ǨùIè÷÷ø8éøøøxù øX÷Ç˜ÙøH÷ç¨ùZ™È÷§øù™˜÷÷¸ù‰ø˜§øHéø÷§ø(™øh÷‡¸ùÙø÷§øùI¸÷÷xùù9¸÷gø8éØ÷÷W¨ÉøØ'øhùÙÈ÷÷Èùè÷÷˜ùù9h÷ÇøHùø÷רù¹è'øøùI˜÷÷ø¹øX÷g¸ùù¸÷÷˜ù™¸×F—øùù¨÷—¨ùø(÷÷øˆ™øxwøHù‰ø÷÷ˆù‰˜÷÷¸ÉZÙÈ÷wøÉøX÷÷øù9øøøhù)ø÷§øù ø÷çxùùÈ÷·ø(ù9È÷÷xùùø(çøhÉÈ÷×øH™ø¨×øùù¸÷÷èù9È÷÷¨ùù)x÷Çø(Éø8÷ÇøùøhWø˜ù‰¨÷÷¸ù9ø÷‡Øùù)x÷÷øù)È÷×øù™øWø¨ùø÷÷øˆIøX÷WÈùÙø÷÷ˆù¹x÷÷ØùÙØ÷gø(yøx÷÷øùøøø(ù‰ø÷ç¨ùiÈ÷÷ˆùù)¸÷—øXù È÷÷˜ù¹øˆgøxé¨÷÷øéøX÷—ˆùù)˜÷÷èù)ø÷ǘùù)˜÷gø¸y¨÷÷7øÙøx§øXùɘ÷÷'˜ùiø(÷wØùù)x÷÷øX©ø÷§ø(ùIø(øøù)Ø÷÷'¨ùyè÷‡èùÙØ÷÷Èù‰ˆ÷Çøù™ø(·øøøx÷ÇøXù¸Wˆ‡Øù¹ø§F÷¨ùy¸÷÷xùù)Ø÷WøøøH÷÷¨ùyøøøù©¨÷÷øù)ø(÷·ˆùù)˜÷÷'Èù ø÷·¸ùùø'Wøø)È÷÷7øùøX÷7èùùx÷÷G¨ùIø÷§èùé¨÷×øøø8÷Wø(ù)ø—øˆùYè÷÷˜ù¹Ø÷‡èÉ*ù¨÷÷øXɈ÷ÇøùIøøøx¹øX÷×øùyÈ÷—˜ùù ¸—vçÈùyx÷÷¨ùéè÷'øøø8÷÷˜ùiøxרùé¨×F÷¨ùYø÷·ˆùù9˜÷÷'ȹø8÷‡èù¹øøøXù˜÷÷g¨ùyø÷w¸ùù ˆ÷÷7Èù9ø÷WøXù©øÈ‡øøØ÷×øùYÈ÷'ø8ù™È÷†‡¸ù™Ø÷—èùù¸÷·ø¨i¸÷—ø8ù)øøøhùø÷÷'Øùiø÷‡xùù9˜§6÷7Èù)¨÷׸ùùøÇøøø8÷÷G˜ù‰ø÷G˜ùùˆ÷÷gxùIøH÷‡˜ù \ No newline at end of file diff --git a/src/mockingboard/hello.wav b/src/mockingboard/hello.wav index db46c4a7e06f2c09e6348ef3a630ef31b3d3a235..94da47bb15daea28539abad90f769798f7c9bdc0 100644 GIT binary patch literal 14982 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 Y0Ui!lzByW0@hDK0Ruxzz5_3HN1DXoCkN^Mx literal 5068 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 bbe;C%o#S8e|TN;S@q diff --git a/src/mockingboard/wave2rlepcm.c b/src/mockingboard/wave2rlepcm.c new file mode 100644 index 0000000..1fc1f24 --- /dev/null +++ b/src/mockingboard/wave2rlepcm.c @@ -0,0 +1,70 @@ +#include +#include + +#define PCM4(p) ((p) < 0xF8 ? (((p) + 8) >> 4) : 0x0F) + +int main(int argc, char **argv) +{ + FILE *fp; + char *wavfile = NULL; + char *pcmfile = "out.pcm"; + unsigned char header[44], *samples, *rlepcm; + unsigned int wavlen, pcmlen, prevpcm, pcm, run; + int i; + + if (argc > 1) + { + wavfile = argv[1]; + if (!(fp = fopen(wavfile, "rb"))) + { + fprintf(stderr, "Ubale to open %s.\n", wavfile); + exit(-1); + } + if (argc > 2) + pcmfile = argv[2]; + } + else + { + fp = stdin; + } + fread(&header, 44, 1, fp); + if (header[0] == 'R' && header[12] == 'f' && header[20] == 1 && header[34] == 8) + { + wavlen = (header[40] | (header[41] << 8) | (header[42] << 16) | (header[43] << 24)); + fprintf(stderr, "WAV length: %d\n", wavlen); + samples = malloc(wavlen); + rlepcm = malloc(wavlen); + fread(samples, wavlen, 1, fp); + } + else + { + fprintf(stderr, "Not 8 bit/samples mono WAV header.\n"); + exit(-1); + } + if (wavfile) + fclose(fp); + if (!(fp = fopen(pcmfile, "wb"))) + { + fprintf(stderr, "Unable to open %s for writing.\n", pcmfile); + exit(-1); + } + prevpcm = PCM4(samples[0]); + run = 1; + pcmlen = 0; + for (i = 1; i < wavlen; i++) + { + pcm = PCM4(samples[i]); + if (pcm == prevpcm && run < 16) + run++; + else + { + rlepcm[pcmlen++] = ((run - 1) << 4) | prevpcm; + prevpcm = pcm; + run = 1; + } + } + fprintf(stderr, "RLE PCM length: %d\n", pcmlen); + fwrite(rlepcm, pcmlen, 1, fp); + fclose(fp); + return 0; +} \ No newline at end of file diff --git a/src/samplesrc/playwav.pla b/src/samplesrc/playpcm.pla similarity index 72% rename from src/samplesrc/playwav.pla rename to src/samplesrc/playpcm.pla index 063f9cd..b5afc17 100755 --- a/src/samplesrc/playwav.pla +++ b/src/samplesrc/playpcm.pla @@ -27,6 +27,15 @@ byte = $09, $0A, $0C, $0D, $0F, $10, $12, $13, $15, $17, $19, $1B, $1D, $1F, $21 byte = $25, $27, $2A, $2C, $2E, $31, $33, $36, $38, $3B, $3E, $40, $43, $46, $49, $4C byte = $4F, $51, $54, $57, $5A, $5D, $60, $63, $67, $6A, $6D, $70, $73, $76, $79, $7C +def wavtopcm4(samples, rep, len)#0 + var i + + rep = (rep - 1) << 4 + for i = 0 to len-1 + samples->[i] = rep | (samples->[i] >> 4) + next +end + arg = argNext(argFirst) if ^arg ref = fileio:open(arg) @@ -35,23 +44,32 @@ if ^arg len = fileio:read(ref, pcm, heapavail) fileio:close(ref) heapalloc(len) - pcm = pcm + 44 - len = len - 44 + if pcm[0] == 'R' and pcm[1] == 'I' and pcm[2] == 'F' + pcm = pcm + 44 + len = len - 44 + wavtopcm4(pcm, 1, len) + fin pcmPlay(pcm, len / 256)#0 fin else - while ^$C000 < 128 - pcmPlay(@sinewave, 1)#0 + wavtopcm4(@sinewave, 16, 256) + memcpy(heapmark, @sinewave, 256) + memcpy(heapmark + 256, @sinewave, 256) + memcpy(heapmark + 512, @sinewave, 256) + memcpy(heapmark + 768, @sinewave, 256) + memcpy(heapmark + 1024, heapmark, 1024) + while ^$C000 < 128 + pcmPlay(heapmark, 8)#0 loop getc - memset(@sinewave, $10F0, 256) + memset(heapmark, $FFF0, 1024) while ^$C000 < 128 - pcmPlay(@sinewave, 1)#0 + pcmPlay(heapmark, 4)#0 loop getc - memset(@sinewave, $8080, 256) + memset(heapmark, $F8F8, 1024) while ^$C000 < 128 - pcmPlay(@sinewave, 1)#0 + pcmPlay(heapmark, 4)#0 loop getc fin