From 1e06b6f9d804049d81989fc121bf382120c29fb6 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Fri, 1 Oct 2021 01:26:09 -0400 Subject: [PATCH] peasant: add electric duet music if no mockingboard --- games/peasant/Makefile | 2 +- games/peasant/TODO | 15 + games/peasant/duet.s | 213 +++++++ games/peasant/music/peasant.ed | Bin 0 -> 255 bytes games/peasant/music/peasant.txt | 654 +++++++++++++++++++ games/peasant/talk/notes | 38 ++ games/peasant/title.s | 246 +++++--- games/peasant/vid_logo.s | 3 +- games/peasant/zp.inc | 12 + music/electric_duet/highwind.txt | 1003 ++++++++++++++++++++++++++++++ music/electric_duet/notes.c | 313 ++++++++++ music/electric_duet/notes.h | 3 + music/electric_duet/peasant.txt | 1003 ++++++++++++++++++++++++++++++ music/electric_duet/text_to_ed.c | 559 +++++++++++++++++ 14 files changed, 3967 insertions(+), 97 deletions(-) create mode 100644 games/peasant/duet.s create mode 100644 games/peasant/music/peasant.ed create mode 100644 games/peasant/music/peasant.txt create mode 100644 games/peasant/talk/notes create mode 100644 music/electric_duet/highwind.txt create mode 100644 music/electric_duet/notes.c create mode 100644 music/electric_duet/notes.h create mode 100644 music/electric_duet/peasant.txt create mode 100644 music/electric_duet/text_to_ed.c diff --git a/games/peasant/Makefile b/games/peasant/Makefile index ca012e27..071fd819 100644 --- a/games/peasant/Makefile +++ b/games/peasant/Makefile @@ -154,7 +154,7 @@ title.o: title.s qload.inc music.inc \ graphics_title/title_graphics.inc \ graphics_title/altfire.inc \ directions.s \ - pt3_lib_mockingboard_patch.s + pt3_lib_mockingboard_patch.s duet.s ca65 -o title.o title.s -l title.lst ### diff --git a/games/peasant/TODO b/games/peasant/TODO index 31237426..ef597106 100644 --- a/games/peasant/TODO +++ b/games/peasant/TODO @@ -1,5 +1,20 @@ TODO: +before 0.75 release ++ update version file ++ merge electric duet ++ complete waterfall, including animation ++ have init routine set starting score, etc + +after 0.75 ++ move copy to disk2 ++ re-do how off edge-of-screen works (have destination for all 4 co-ords?) ++ move drawing to PAGE1 and use PAGE2 for RAM? + This would remove backing store when drawing text boxes? ++ add dictionary lookup for text ++ add standard set of text box sizes + + General: - More frames in peasant sprites - Hook up text parser diff --git a/games/peasant/duet.s b/games/peasant/duet.s new file mode 100644 index 00000000..4151a083 --- /dev/null +++ b/games/peasant/duet.s @@ -0,0 +1,213 @@ +; *************************************************************************** +; * Copyright (C) 1979-2015 by Paul Lutus * +; * http://arachnoid.com/administration * +; * * +; * This program is free software; you can redistribute it and/or modify * +; * it under the terms of the GNU General Public License as published by * +; * the Free Software Foundation; either version 2 of the License, or * +; * (at your option) any later version. * +; * * +; * This program is distributed in the hope that it will be useful, * +; * but WITHOUT ANY WARRANTY; without even the implied warranty of * +; * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +; * GNU General Public License for more details. * +; * * +; * You should have received a copy of the GNU General Public License * +; * along with this program; if not, write to the * +; * Free Software Foundation, Inc., * +; * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * +; *************************************************************************** + +; 645d roughly trogdor music + +; Electric Duet Player Routine circa 1980 + +; Formatting / comments added by Vince Weaver + +; These are all "Free" zero page locations +;FREQ1 = $10 +;FREQ2 = $11 +;DURATION = $12 +;INSTRUMENT1 = $13 +;INSTRUMENT2 = $14 +;MADDRL = $15 +;MADDRH = $16 +;LOC4E = $4E +;COUNT256 = $4F + +play_ed: + lda #$01 ; 900: A9 01 ; 2 *!* + sta INSTRUMENT1 ; 902: 85 09 ; 3 set default + sta INSTRUMENT2 ; 904: 85 1D ; 3 instruments + pha ; 906: 48 ; 3 1 on stack + pha ; 907: 48 ; 3 1 on stack + pha ; 908: 48 ; 3 1 on stack + bne load_triplet ; 909: D0 15 ; 4 *!* start decoding + +change_instrmnt: + iny ; 90B: C8 ; 2 + lda (MADDRL),Y ; 90C: B1 1E ; 5 *!* load next byte + sta INSTRUMENT1 ; 90E: 85 09 ; 3 save instrument + iny ; 910: C8 ; 2 + lda (MADDRL),Y ; 911: B1 1E ; 5 *!* load next byte + sta INSTRUMENT2 ; 913: 85 1D ; 3 save instrument + +triplet_loop: + + ; flash different if trogdor music + ldy #2 + lda (MADDRL),Y + cmp #24 ; D4 + beq no_trogdor + bit PAGE2 + jmp done_duet_trog +no_trogdor: + bit PAGE1 +done_duet_trog: + + lda MADDRL ; 915: A5 1E ; 3 *!* increment pointer + clc ; 917: 18 ; 2 by three + adc #$03 ; 918: 69 03 ; 2 *!* + sta MADDRL ; 91A: 85 1E ; 3 + + bcc load_triplet ; 91C: 90 02 ; 4 *!* if overflow + inc MADDRH ; 91E: E6 1F ; 5 update high byte + +load_triplet: + ldy #$00 ; 920: A0 00 ; 2 *!* Set Y to zero + lda (MADDRL),Y ; 922: B1 1E ; 5 *!* Load first byte + cmp #$01 ; 924: C9 01 ; 2 Compare to 1 + beq change_instrmnt ; 926: F0 E3 ; 4 *!* If one change inst + bcs play_note ; 928: B0 0D ; 4 *!* If >1, then duration + pla ; 92A: 68 ; 4 pop off stack + pla ; 92B: 68 ; 4 pop off stack + pla ; 92C: 68 ; 4 pop off stack + + ; fallthrough if first byte was zero + + ; Load byte from music stream + ; Set X=EOR if note zero, set X=CMP if it is + +load_freq: + ldx #$49 ; 92D: A2 49 ; 2 *!* X=0x49 (EOR opcode) + iny ; 92F: C8 ; 2 increment to next byte + lda (MADDRL),Y ; 930: B1 1E ; 5 *!* load next byte + bne exit_player ; 932: D0 02 ; 4 *!* if not zero + ldx #$C9 ; 934: A2 C9 ; 2 *!* X=0xC9 (CMP opcode) + +exit_player: + ; if byte0==0 and byte1==0 then end (I have no idea how) + rts ; 936: 60 ; 6 return + + ; We've got a duration/note/note triplet here + +play_note: + sta DURATION ; 937: 85 08 ; 3 store out duration + jsr load_freq ; 939: 20 2D09 ; 6 get freq#1 + stx selfmodify1 ; 93C: 8E 8309 ; 4 if 0 self-modify EOR/CMP + sta FREQ1 ; 93F: 85 06 ; 3 + ldx INSTRUMENT1 ; 941: A6 09 ; 3 *!* + +instr1_adjust: + lsr A ; 943: 4A ; 2 rshift freq by inst# + dex ; 944: CA ; 2 + bne instr1_adjust ; 945: D0 FC ; 4 *!* + sta selfmodify2+1 ; 947: 8D 7C09 ; 4 self-modify a CPY + + jsr load_freq ; 94A: 20 2D09 ; 6 get freq#2 + stx selfmodify3 ; 94D: 8E BB09 ; 4 if 0 self-modify EOR/CMP + sta FREQ2 ; 950: 85 07 ; 3 + ldx INSTRUMENT2 ; 952: A6 1D ; 3 *!* +instr2_adjust: + lsr A ; 954: 4A ; 2 rshift freq by inst# + dex ; 955: CA ; 2 + bne instr2_adjust ; 956: D0 FC ; 4 *!* + sta selfmodify4+1 ; 958: 8D B409 ; 4 self modify a CPX + + pla ; 95B: 68 ; 4 + tay ; 95C: A8 ; 2 + pla ; 95D: 68 ; 4 + tax ; 95E: AA ; 2 + pla ; 95F: 68 ; 4 + bne label8 ; 960: D0 03 ; 4 *!* + +label99: + bit $C030 ; 962: 2C 30C0 ; 4 SPEAKER +label8: + cmp #$00 ; 965: C9 00 ; 2 + bmi label7 ; 967: 30 03 ; 4 *!* + nop ; 969: EA ; 2 + bpl label9 ; 96A: 10 03 ; 4 *!* +label7: + bit $C030 ; 96C: 2C 30C0 ; 4 SPEAKER +label9: + sta LOC4E ; 96F: 85 4E ; 3 + bit $C000 ; 971: 2C 00C0 ; 4 KEYBOARD DATA + bmi exit_keypress ; 974: 30 C0 ; 4 *!* if keypress, exit + dey ; 976: 88 ; 2 + bne selfmodify2 ; 977: D0 02 ; 4 *!* + beq label11 ; 979: F0 06 ; 4 *!* +selfmodify2: + cpy #$00 ; 97B: C0 00 ; 2 + beq selfmodify1 ; 97D: F0 04 ; 4 *!* !!! + bne label13 ; 97F: D0 04 ; 4 *!* +label11: + ldy FREQ1 ; 981: A4 06 ; 3 *!* +selfmodify1: + eor #$40 ; 983: 49 40 ; 2 *!* !!! +label13: + bit LOC4E ; 985: 24 4E ; 3 + bvc label14 ; 987: 50 07 ; 4 *!* + bvs label15 ; 989: 70 00 ; 4 *!* +label15: + bpl label16 ; 98B: 10 09 ; 4 *!* + nop ; 98D: EA ; 2 + bmi label17 ; 98E: 30 09 ; 4 *!* +label14: + nop ; 990: EA ; 2 + bmi label16 ; 991: 30 03 ; 4 *!* + nop ; 993: EA ; 2 + bpl label17 ; 994: 10 03 ; 4 *!* +label16: + cmp $C030 ; 996: CD 30C0 ; 4 SPEAKER +label17: + dec COUNT256 ; 999: C6 4F ; 5 div by 256 counter + bne label18 ; 99B: D0 11 ; 4 *!* + + dec DURATION ; 99D: C6 08 ; 5 + bne label18 ; 99F: D0 0D ; 4 *!* + bvc label19 ; 9A1: 50 03 ; 4 *!* + bit $C030 ; 9A3: 2C 30C0 ; 4 SPEAKER +label19: + pha ; 9A6: 48 ; 3 + txa ; 9A7: 8A ; 2 + pha ; 9A8: 48 ; 3 + tya ; 9A9: 98 ; 2 + pha ; 9AA: 48 ; 3 + jmp triplet_loop ; 9AB: 4C 1509 ; 3 + +label18: + dex ; 9AE: CA ; 2 + bne selfmodify4 ; 9AF: D0 02 ; 4 *!* + beq label21 ; 9B1: F0 06 ; 4 *!* +selfmodify4: + cpx #$00 ; 9B3: E0 00 ; 2 + beq selfmodify3 ; 9B5: F0 04 ; 4 *!* !!! + bne label23 ; 9B7: D0 04 ; 4 *!* +label21: + ldx FREQ2 ; 9B9: A6 07 ; 3 *!* +selfmodify3: + eor #$80 ; 9BB: 49 80 ; 2 *!* !!! +label23: + bvs label99 ; 9BD: 70 A3 ; 4 *!* + nop ; 9BF: EA ; 2 + bvc label8 ; 9C0: 50 A3 ; 4 *!* + +exit_keypress: + inc duet_done + rts + + + +duet_done: + .byte $00 diff --git a/games/peasant/music/peasant.ed b/games/peasant/music/peasant.ed new file mode 100644 index 0000000000000000000000000000000000000000..eb970d2142cbe200f4e601800510c41d056e0e6c GIT binary patch literal 255 zcmb7<&XFAQVsK-2c%w?Xv&PEMlgtjGk3*H^kQ##Y) OzgRD_i0}NZuXA0VDjmH5 literal 0 HcmV?d00001 diff --git a/games/peasant/music/peasant.txt b/games/peasant/music/peasant.txt new file mode 100644 index 00000000..83d0d776 --- /dev/null +++ b/games/peasant/music/peasant.txt @@ -0,0 +1,654 @@ +' +' TITLE: Peasant's Quest Theme +' AUTHOR: (tracked by) Vince Weaver +' COMMENTS: based on MIDI found online +' +' LOOP: 640 +' +' BPM: 250 +' TEMPO: 6 +' FREQ: 1000000 +' IRQ: 50 +' +' LYRICS: 0 +' +' ENDHEADER +------- +' 0 +0 C 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 C 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 C 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 C 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 C 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 C 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C C 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 0 again +0 C 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 C 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 C 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 C 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 C 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 C 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C C 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 1 +0 F 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 F 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 F 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 F 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 F 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 F 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C F 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 2 +0 G 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C G 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 G 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 G 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 G 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 G 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 G 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C G 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 3 +0 C 2 3 C 4 4 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- C 4 4 ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- C 4 4 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 2 3 C 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 C 2 3 C 4 4 ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 C 2 3 C 4 4 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 C 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 C 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 C 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C C 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 4 +0 C 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 4 3 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 2 3 G 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 C 2 3 G 4 3 ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 C 2 3 F 4 3 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 C 2 3 F 4 4 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- F 4 3 ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- E 4 3 ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 C 2 3 E 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 C 2 3 E 4 3 ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C C 2 3 F 4 3 ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 5 +0 F 2 3 C 4 4 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- C 4 4 ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- C 4 4 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 2 3 C 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 F 2 3 C 4 4 ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 F 2 3 C 4 4 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 F 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 F 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 F 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C F 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 6 +0 G 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 4 3 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C G 2 3 G 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 G 2 3 G 4 3 ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 G 2 3 F 4 3 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 G 2 3 F 4 4 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- F 4 3 ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- E 4 3 ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 G 2 3 E 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 G 2 3 E 4 3 ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C G 2 3 F 4 3 ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 7 +0 C 2 3 D 4 3 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- D 4 6 ----- +4 ----- D 4 8 ----- +5 ----- ----- ----- +6 ----- D 4 3 ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- D 4 3 ----- +A ----- ----- ----- +B ----- ----- ----- +C C 2 3 A#4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 C 2 3 A#4 4 ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 C 2 3 A#4 3 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 C 2 3 D 4 3 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- D 4 6 ----- +1C ----- D 4 8 ----- +1D ----- ----- ----- +1E ----- D 4 4 ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- D 4 8 ----- +23 ----- ----- ----- +24 C 2 3 G 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 C 2 3 G 4 4 ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C C 2 3 G 4 3 ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 8 +0 C 2 3 D 4 3 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- D 4 6 ----- +4 ----- D 4 8 ----- +5 ----- ----- ----- +6 ----- D 4 8 ----- +7 ----- ----- ----- +8 ----- D 4 4 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 2 3 A#4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 C 2 3 A#4 8 ----- +11 ----- ----- ----- +12 ----- D 4 4 ----- +13 ----- ----- ----- +14 C 2 3 ----- ----- +15 ----- ----- ----- +16 ----- D 4 8 ----- +17 ----- ----- ----- +18 C 2 3 G 4 4 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- G 4 8 ----- +1D ----- ----- ----- +1E ----- D 4 4 ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- D 4 8 ----- +23 ----- ----- ----- +24 C 2 3 F 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 C 2 3 F 4 8 ----- +29 ----- ----- ----- +2A ----- G 4 4 ----- +2B ----- ----- ----- +2C C 2 3 ----- ----- +2D ----- ----- ----- +2E ----- G 4 8 ----- +2F ----- ----- ----- +' 5 +0 F 2 3 C 4 4 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- C 4 4 ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- C 4 4 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 2 3 C 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 F 2 3 C 4 4 ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 F 2 3 C 4 4 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 F 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 F 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 F 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C F 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 6 +0 G 2 3 ----- ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 4 3 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C G 2 3 G 4 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 G 2 3 G 4 3 ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 G 2 3 F 4 3 ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 G 2 3 F 4 4 ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- F 4 3 ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- E 4 3 ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 G 2 3 E 4 4 ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 G 2 3 E 4 3 ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C G 2 3 F 4 3 ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' 9 +0 C 2 3 G 4 4 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- G 4 4 ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 4 3 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 2 3 ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +10 C 2 3 ----- ----- +11 ----- ----- ----- +12 ----- ----- ----- +13 ----- ----- ----- +14 C 2 3 ----- ----- +15 ----- ----- ----- +16 ----- ----- ----- +17 ----- ----- ----- +18 C 2 3 ----- ----- +19 ----- ----- ----- +1A ----- ----- ----- +1B ----- ----- ----- +1C ----- ----- ----- +1D ----- ----- ----- +1E ----- ----- ----- +1F ----- ----- ----- +20 ----- ----- ----- +21 ----- ----- ----- +22 ----- ----- ----- +23 ----- ----- ----- +24 C 2 3 ----- ----- +25 ----- ----- ----- +26 ----- ----- ----- +27 ----- ----- ----- +28 C 2 3 ----- ----- +29 ----- ----- ----- +2A ----- ----- ----- +2B ----- ----- ----- +2C C 2 3 ----- ----- +2D ----- ----- ----- +2E ----- ----- ----- +2F ----- ----- ----- +' LOOP TO FRAME 8 diff --git a/games/peasant/talk/notes b/games/peasant/talk/notes new file mode 100644 index 00000000..54f0022c --- /dev/null +++ b/games/peasant/talk/notes @@ -0,0 +1,38 @@ +Demakes + +HGr-MIST + +HGR + (horrible hgr) + +Backgrounds + AGI-like? They abandoned it. Would save space + +Sprites + easier in blocks 0f 7 + still have to rotate 1 pixel for odd columns + transparency a pain with color clash + +Animations + too big? + +Mini-games? + +Text + HGR drawing lib (no built in on 2) + How to fit? Lookup for common word distribution? + +Ram-map + +Music + Mockingboard, pt3 player + no mockingboard, electric duet, but can't do more than + page flip (missing flame). Worth it? + +Speech + Can we do SAM? 9k? + SSI-263 but unobtanium + +Disks: + Fitting on disk. + swappign fun for nostalgia, not so much when actually playing diff --git a/games/peasant/title.s b/games/peasant/title.s index 844d2ecb..29d3ba1e 100644 --- a/games/peasant/title.s +++ b/games/peasant/title.s @@ -18,83 +18,8 @@ title: jsr hgr_make_tables - ;======================== - ; Music - ;======================== - ;=================================== - ; Setup Mockingboard - ;=================================== - -PT3_ENABLE_APPLE_IIC = 1 - - lda SOUND_STATUS - and #SOUND_MOCKINGBOARD - beq mockingboard_notfound - - ;================================== - ; load music into the language card - ; into $D000 set 2 - ;================================== - - ; switch in language card - ; read/write RAM, $d000 bank 2 - - lda $C083 - lda $C083 - -; lda $C081 ; enable ROM -; lda $C081 ; enable write - - ; actually load it - lda #LOAD_MUSIC - sta WHICH_LOAD - - jsr load_file - - - lda #0 - sta DONE_PLAYING - - lda #1 - sta LOOP - - jsr mockingboard_patch ; patch to work in slots other than 4? - - ;======================= - ; Set up 50Hz interrupt - ;======================== - - jsr mockingboard_init - jsr mockingboard_setup_interrupt - - -zurg: - - ;============================ - ; Init the Mockingboard - ;============================ - - jsr reset_ay_both - jsr clear_ay_both - - ;================== - ; init song - ;================== - - jsr pt3_init_song - - - - ;======================= - ; start music - ;======================= - - cli - -mockingboard_notfound: - ;========================= ;========================= @@ -135,8 +60,112 @@ do_title: bit KEYRESET + + lda SOUND_STATUS + and #SOUND_MOCKINGBOARD + beq mockingboard_notfound + + + jsr mockingboard_loop + jmp title_loop_done + +mockingboard_notfound: + + jsr duet_loop + +title_loop_done: + + + ;************************ + ; Tips + ;************************ + + jsr directions + + + lda #LOAD_INTRO + sta WHICH_LOAD + + + rts + + + + + ;===================== - ; main loop + ;===================== + ; mockingboard loop + ;===================== + ;===================== + +mockingboard_loop: + + ;=================================== + ; Setup Mockingboard + ;=================================== + +PT3_ENABLE_APPLE_IIC = 1 + + ;================================== + ; load music into the language card + ; into $D000 set 2 + ;================================== + + ; switch in language card + ; read/write RAM, $d000 bank 2 + + lda $C083 + lda $C083 + +; lda $C081 ; enable ROM +; lda $C081 ; enable write + + ; actually load it + lda #LOAD_MUSIC + sta WHICH_LOAD + + jsr load_file + + lda #0 + sta DONE_PLAYING + + lda #1 + sta LOOP + + jsr mockingboard_patch ; patch to work in slots other than 4? + + ;======================= + ; Set up 50Hz interrupt + ;======================== + + jsr mockingboard_init + jsr mockingboard_setup_interrupt + + +zurg: + + ;============================ + ; Init the Mockingboard + ;============================ + + jsr reset_ay_both + jsr clear_ay_both + + ;================== + ; init song + ;================== + + jsr pt3_init_song + + + + ;======================= + ; start music + ;======================= + + cli + ; we're supposed to animate flame, flash the "CLICK ANYWHERE" sign ; and show trogdor when his music plays @@ -221,34 +250,57 @@ altfire_good: bit PAGE2 ; return to viewing PAGE2 - ;============================== - ; disable music, if applicable - - lda SOUND_STATUS - and #SOUND_MOCKINGBOARD - beq mockingboard_notfound2 + ;============== + ; disable music sei ; disable music jsr clear_ay_both -mockingboard_notfound2: - - ;************************ - ; Tips - ;************************ - - jsr directions - - - lda #LOAD_INTRO - sta WHICH_LOAD - rts + ;===================== + ;===================== + ; Electric Duet Loop + ;===================== + ;===================== + +duet_loop: + + + lda #peasant_ed + sta MADDRH + +duet_loop_again: + jsr play_ed + + lda #1 + sta peasant_ed+24 + lda #0 + sta peasant_ed+25 + sta peasant_ed+26 + + + lda #<(peasant_ed+24) + sta MADDRL + lda #>(peasant_ed+24) + sta MADDRH + + lda duet_done + beq duet_loop_again + +duet_finished: + bit KEYRESET + + rts + + + ;.include "decompress_fast_v2.s" .include "wait_keypress.s" @@ -256,9 +308,13 @@ mockingboard_notfound2: ;.include "hgr_font.s" ;.include "hgr_tables.s" - ;.include "hgr_hgr2.s" +.include "duet.s" + +peasant_ed: +.incbin "music/peasant.ed" + .include "pt3_lib_mockingboard_patch.s" .include "graphics_title/title_graphics.inc" diff --git a/games/peasant/vid_logo.s b/games/peasant/vid_logo.s index c51cd42b..018a2830 100644 --- a/games/peasant/vid_logo.s +++ b/games/peasant/vid_logo.s @@ -33,7 +33,7 @@ intro_text: lda #>boot_message sta OUTH - ldx #7 + ldx #8 text_loop: jsr move_and_print @@ -442,6 +442,7 @@ boot_message: .byte 0,5,"APPLE II PORT: VINCE WEAVER",0 .byte 0,6,"DISK CODE : QKUMBA",0 .byte 0,7,"LZSA CODE : EMMANUEL MARTY",0 +.byte 0,8,"ELECTRIC DUET: PAUL LUTUS",0 .byte 7,19,"______",0 .byte 5,20,"A \/\/\/ SOFTWARE PRODUCTION",0 diff --git a/games/peasant/zp.inc b/games/peasant/zp.inc index 5b71dead..5d45549f 100644 --- a/games/peasant/zp.inc +++ b/games/peasant/zp.inc @@ -18,6 +18,18 @@ TEMP3 = $13 TEMP4 = $14 TEMP5 = $15 +; electric duet +FREQ1 = $10 +FREQ2 = $11 +DURATION = $12 +INSTRUMENT1 = $13 +INSTRUMENT2 = $14 +MADDRL = $15 +MADDRH = $16 +LOC4E = $4E +COUNT256 = $4F + + HGR_BITS = $1C CH = $24 diff --git a/music/electric_duet/highwind.txt b/music/electric_duet/highwind.txt new file mode 100644 index 00000000..875f1ab6 --- /dev/null +++ b/music/electric_duet/highwind.txt @@ -0,0 +1,1003 @@ +' +' TITLE: Highwind Takes to the Skies +' AUTHOR: (tracked by) Vince Weaver +' COMMENTS: by Nobuo Uematsu, From Final Fantasy VII, Arranged by Thomas Wilson +' +' LOOP: 640 +' +' BPM: 136 +' TEMPO: 6 +' FREQ: 1000000 +' IRQ: 50 +' +' LYRICS: 0 +' +' ENDHEADER +------- +' 1 +0 ----- A 3 6 ----- +1 ----- B 3 6 ----- +2 ----- C#4 6 ----- +3 ----- E 4 6 ----- +4 A 5 4 A 3 6 A 4 4 +5 ----- B 3 6 ----- +6 ----- C 4 6 ----- +7 ----- E 4 6 ----- +8 B 5 4 A 3 6 B 4 4 +9 ----- B 3 6 ----- +A ----- C 4 6 ----- +B ----- E 4 6 ----- +C E 6 4 A 3 6 E 5 4 +D ----- B 3 6 ----- +E ----- C 4 6 ----- +F ----- E 4 6 ----- +' 2 +0 D#6 4 A 3 6 D#5 4 +1 ----- B 3 6 ----- +2 ----- C#4 6 ----- +3 ----- E 4 6 ----- +4 C#6 4 A 3 6 C#5 4 +5 ----- B 3 6 ----- +6 ----- C 4 6 ----- +7 ----- E 4 6 ----- +8 B 5 4 A 3 6 B 4 4 +9 ----- B 3 6 ----- +A ----- C 4 6 ----- +B ----- E 4 6 ----- +C A 5 4 A 3 6 A 4 4 +D ----- B 3 6 ----- +E ----- C 4 6 ----- +F ----- E 4 6 ----- +' 3 +0 G 5 4 G 3 6 G 4 4 +1 ----- A 3 6 ----- +2 ----- B 3 6 ----- +3 ----- D 4 6 ----- +4 A 5 4 G 3 6 A 4 4 +5 ----- A 3 6 ----- +6 ----- B 3 6 ----- +7 ----- D 4 6 ----- +8 F#5 < G 3 6 D 4 2 +9 ----- A 3 6 ----- +A ----- B 3 6 ----- +B ----- D 4 6 ----- +C ----- G 3 6 ----- +D ----- A 3 6 ----- +E ----- B 3 6 ----- +F ----- D 4 6 ----- +' 4 +0 ----- G 3 6 C#5 2 +1 ----- A 3 6 ----- +2 ----- B 3 6 ----- +3 ----- D 4 6 ----- +4 ----- G 3 6 ----- +5 ----- A 3 6 ----- +6 ----- B 3 6 ----- +7 ----- D 4 6 ----- +8 ----- G 3 6 B 4 2 +9 ----- A 3 6 ----- +A ----- B 3 6 ----- +B ----- D 4 6 ----- +C ----- G 3 6 ----- +D ----- A 3 6 ----- +E ----- B 3 6 ----- +F ----- D 4 6 ----- +' 5 +0 ----- F 3 6 ----- +1 ----- G 3 6 ----- +2 ----- A 3 6 ----- +3 ----- C 4 6 ----- +4 B 5 4 F 3 6 B 4 4 +5 ----- G 3 6 ----- +6 ----- A 3 6 ----- +7 ----- C 4 6 ----- +8 C 6 4 F 3 6 C 5 4 +9 ----- G 3 6 ----- +A ----- A 3 6 ----- +B ----- C 4 6 ----- +C F 6 4 F 3 6 F 5 4 +D ----- G 3 6 ----- +E ----- A 3 6 ----- +F ----- C 4 6 ----- +' 6 +0 E 6 4 F 3 6 E 5 4 +1 ----- G 3 6 ----- +2 ----- A 3 6 ----- +3 ----- C 4 6 ----- +4 D 6 4 F 3 6 D 5 4 +5 ----- G 3 6 ----- +6 ----- A 3 6 ----- +7 ----- C 4 6 ----- +8 C 6 4 F 3 6 C 5 4 +9 ----- G 3 6 ----- +A ----- A 3 6 ----- +B ----- C 4 6 ----- +C B-5 4 F 3 6 B-4 4 +D ----- G 3 6 ----- +E ----- A 3 6 ----- +F ----- C 4 6 ----- +' 7 +0 A-5 4 A-3 6 C 5 2 +1 ----- B-3 6 ----- +2 ----- C 4 6 ----- +3 ----- E-4 6 ----- +4 B-5 4 A 3 6 ----- +5 ----- B 3 6 ----- +6 ----- C 4 6 ----- +7 ----- E 4 6 ----- +8 E-6 < A 3 6 B-5 4 +9 ----- B 3 6 ----- +A ----- C 4 6 ----- +B ----- E 4 6 ----- +C ----- A 3 6 D-6 4 +D ----- B 3 6 ----- +E ----- C 4 6 ----- +F ----- E 4 6 ----- +' 8 +0 ----- A-3 6 C 6 1 +1 ----- B-3 6 ----- +2 ----- C 4 6 ----- +3 ----- E-4 6 ----- +4 ----- A 3 6 ----- +5 ----- B 3 6 ----- +6 ----- C 4 6 ----- +7 ----- E 4 6 ----- +8 ----- A 3 6 ----- +9 ----- B 3 6 ----- +A ----- C 4 6 ----- +B ----- E 4 6 ----- +C ----- A 3 6 ----- +D ----- B 3 6 ----- +E ----- C 4 6 ----- +F ----- E 4 6 ----- +' 9 +0 D-5 2 D-3 1 A-4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- D-5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 10 +0 C 6 2 B-2 1 A-5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 2 ----- F 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 11 +0 ----- D-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 D-5 4 ----- A-4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- D-5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 12 +0 A-5 4 B=2 2 F-5 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 G-5 4 ----- E-5 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D-5 4 C-3 2 B=4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C E-5 4 ----- C 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 13 +0 D-5 2 D-3 1 A-4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- D-5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 14 +0 C 6 2 B-2 1 A-5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 2 ----- F 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 15 +0 ----- D-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 D-5 4 ----- A-4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- D-5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 16 +0 A-5 4 G-3 1 F 5 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 G-5 4 ----- E-5 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D-5 4 ----- B-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C E-5 4 ----- G-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 17 +0 F 5 1 F-3 2 A-4 1 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 3 4 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- A 3 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 18 +0 ----- B-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 F 5 4 ----- A-4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 A-5 4 ----- C 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- B-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 19 +0 E-5 2 C-4 2 E-4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-4 4 G-3 4 F 4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 5 4 C 4 4 E-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 20 +0 A-4 2 C 4 2 E-4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 G-4 4 A-3 2 D-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C A-4 4 ----- E-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 21 +0 D-5 2 D-3 1 F 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- A-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 22 +0 C 6 2 B-2 1 E-5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 2 ----- D-5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 23 +0 ----- D-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 D-5 4 ----- F 4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- A-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 24 +0 A-5 4 B=2 2 F-5 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 G-5 4 ----- E-5 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D-5 4 C-3 2 B=4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C E-5 4 ----- C-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 25 +0 D-5 2 D-3 1 F 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- A-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 26 +0 C 6 2 B-3 1 E-5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 2 ----- D-5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 27 +0 ----- D-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 D-5 4 ----- F 4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- A-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 28 +0 A-5 4 G-3 1 F 5 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 G-5 4 ----- E-5 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 4 ----- F 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 6 4 ----- A-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 29 +0 D 6 2 B 2 2 F#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 C#6 4 C#3 2 E 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 5 4 ----- D 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 30 +0 F#5 2 D 3 2 B 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B 5 2 B 2 2 D 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 31 +0 A#5 : F#3 = C#5 : +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 4 4 ----- F#4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 32 +0 C#5 4 ----- A#4 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 A 4 8 ----- C#4 8 +5 ----- ----- ----- +6 C#5 6 ----- F#4 6 +7 C#5 6 ----- F#4 6 +8 C#5 8 ----- F#4 8 +9 ----- ----- ----- +A A 4 8 ----- F#4 8 +B ----- ----- ----- +C B 4 8 ----- F#4 8 +D ----- ----- ----- +E C#5 8 ----- F#4 8 +F ----- ----- ----- +' 33 +0 D 6 2 B 2 2 F#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 C#6 4 C#3 2 E 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 5 4 ----- D 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 34 +0 F#5 2 D 3 2 B 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B 5 2 B 2 2 D 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 35 +0 C#6 : A 3 = E 5 : +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 4 4 ----- E 4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 36 +0 C#5 4 ----- A#4 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 A 4 8 ----- C#4 8 +5 ----- ----- ----- +6 C#5 6 ----- A 4 6 +7 C#5 6 ----- A 4 6 +8 C#5 8 ----- A 4 8 +9 ----- ----- ----- +A B 4 8 ----- A 4 8 +B ----- ----- ----- +C C#5 8 ----- A 4 8 +D ----- ----- ----- +E D#5 8 ----- A 4 8 +F ----- ----- ----- +' 37 +0 E 6 2 C#3 2 G#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D#6 4 D#3 2 F#5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C#6 4 ----- E 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 38 +0 G#5 2 E 3 2 C#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 C#6 2 C#3 2 E 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 39 +0 B 5 : G#2 2 D#5 : +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- A#2 2 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C#5 4 ----- A#4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 40 -- note: mistake in sheet music (# not natural) +0 D#5 4 B 2 2 B 4 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 B 4 8 ----- G#4 8 +5 ----- ----- ----- +6 D 5 6 ----- G#4 6 +7 D 5 6 ----- G#4 6 +8 D 5 8 C#3 2 G#4 8 +9 ----- ----- ----- +A B 4 8 ----- G#4 8 +B ----- ----- ----- +C C#5 8 ----- G#4 8 +D ----- ----- ----- +E D#5 8 ----- G#4 8 +F ----- ----- ----- +' 41 +0 D#6 2 B 2 2 F#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 C#6 4 C#3 2 E 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 5 4 ----- D#5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 42 +0 F#5 2 D#3 2 B 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D#5 6 E 3 2 B 4 6 +9 E 5 6 ----- C#5 6 +A F#5 6 ----- D 5 6 +B G#5 6 ----- E 5 6 +C A#5 6 ----- F#5 6 +D B 5 6 ----- G#5 6 +E C#5 6 ----- A 5 6 +F D#5 6 ----- B 5 6 +' 43 +0 F#6 2 F#3 < ----- +1 ----- ----- ----- +2 ----- ----- F#5 6 +3 ----- ----- G 5 6 +4 ----- ----- A#5 6 +5 ----- ----- B 5 6 +6 ----- ----- C#6 8 +7 ----- ----- ----- +8 C#6 5 ----- C#5 6 +9 ----- ----- D#5 6 +A ----- ----- E#5 6 +B ----- ----- F#5 6 +C ----- ----- A 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 44 +0 ----- ----- ----- +1 ----- ----- ----- +2 C#5 6 ----- ----- +3 A#4 6 ----- ----- +4 C#5 8 ----- ----- +5 ----- ----- ----- +6 F#5 8 ----- ----- +7 ----- ----- ----- +8 A#5 8 F#3 8 ----- +9 ----- ----- ----- +A C#5 8 E 3 8 ----- +B ----- ----- ----- +C F#5 8 D 3 8 ----- +D ----- ----- ----- +E A 5 8 C#3 8 ----- +F ----- ----- ----- +' 45 +0 B 6 2 B 2 < ----- +1 ----- ----- ----- +2 ----- ----- B 4 6 +3 ----- ----- C#5 6 +4 ----- ----- D 5 6 +5 ----- ----- E 5 6 +6 ----- ----- F#5 8 +7 ----- ----- ----- +8 F#5 5 ----- F#4 6 +9 ----- ----- G#4 6 +A ----- ----- A#4 6 +B ----- ----- B 4 6 +C ----- ----- D 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 46 +0 ----- ----- ----- +1 ----- ----- ----- +2 D 5 6 ----- ----- +3 B 4 6 ----- ----- +4 D 5 8 ----- ----- +5 ----- ----- ----- +6 F#5 8 ----- ----- +7 ----- ----- ----- +8 B 5 8 B 2 4 ----- +9 ----- ----- ----- +A D 5 8 ----- ----- +B ----- ----- ----- +C F#5 8 C#3 4 ----- +D ----- ----- ----- +E B 5 8 ----- ----- +F ----- ----- ----- +' 47 +0 D 6 2 D 3 < ----- +1 ----- ----- ----- +2 ----- ----- D 5 6 +3 ----- ----- E 5 6 +4 ----- ----- F 5 6 +5 ----- ----- G 5 6 +6 ----- ----- A 5 8 +7 ----- ----- ----- +8 A 5 5 ----- A 4 6 +9 ----- ----- B 4 6 +A ----- ----- C 5 6 +B ----- ----- D 5 6 +C ----- ----- F#5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 48 +0 ----- ----- ----- +1 ----- ----- ----- +2 D 5 6 ----- ----- +3 A 4 6 ----- ----- +4 D 5 8 ----- ----- +5 ----- ----- ----- +6 F 5 8 ----- ----- +7 ----- ----- ----- +8 A 5 8 C#3 4 ----- +9 ----- ----- ----- +A D 5 8 ----- ----- +B ----- ----- ----- +C F#5 8 B 2 4 ----- +D ----- ----- ----- +E A 5 8 ----- ----- +F ----- ----- ----- +' 49 +0 C 6 2 A 2 < ----- +1 ----- ----- ----- +2 ----- ----- A 4 6 +3 ----- ----- B 4 6 +4 ----- ----- C#5 6 +5 ----- ----- D 5 6 +6 ----- ----- E 5 8 +7 ----- ----- ----- +8 E 5 5 ----- E 4 6 +9 ----- ----- F#4 6 +A ----- ----- G#4 6 +B ----- ----- A 4 6 +C ----- ----- C#5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 50 +0 ----- ----- ----- +1 ----- ----- ----- +2 E 5 6 ----- ----- +3 C#5 6 ----- ----- +4 E 5 8 ----- ----- +5 ----- ----- ----- +6 A 5 8 ----- ----- +7 ----- ----- ----- +8 C#6 8 A 2 4 ----- +9 ----- ----- ----- +A E 5 8 ----- ----- +B ----- ----- ----- +C A 5 8 B 2 4 ----- +D ----- ----- ----- +E C#6 8 ----- ----- +F ----- ----- ----- +' 51 +0 E 5 2 C#3 < ----- +1 ----- ----- ----- +2 ----- ----- C#5 6 +3 ----- ----- D#5 6 +4 ----- ----- E 5 6 +5 ----- ----- F#5 6 +6 ----- ----- G#5 8 +7 ----- ----- ----- +8 G#5 5 ----- G#4 6 +9 ----- ----- A#4 6 +A ----- ----- B 4 6 +B ----- ----- C#5 6 +C ----- ----- E 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 52 +0 ----- ----- ----- +1 ----- ----- ----- +2 C#5 6 ----- ----- +3 G 4 6 ----- ----- +4 C#5 8 ----- ----- +5 ----- ----- ----- +6 E 5 8 ----- ----- +7 ----- ----- ----- +8 G#5 8 B 2 4 ----- +9 ----- ----- ----- +A C#5 8 ----- ----- +B ----- ----- ----- +C E 5 8 A 2 4 ----- +D ----- ----- ----- +E G#5 8 ----- ----- +F ----- ----- ----- +' 53 +0 D#6 ; G 2 < ----- +1 ----- ----- ----- +2 ----- ----- G#5 6 +3 ----- ----- A#5 6 +4 ----- ----- B 5 6 +5 ----- ----- C#6 6 +6 ----- ----- B 5 8 +7 ----- ----- ----- +8 ----- ----- D#5 6 +9 ----- ----- E#5 6 +A ----- ----- F#5 6 +B ----- ----- G#5 6 +C ----- ----- B 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 54 +0 ----- ----- ----- +1 ----- ----- ----- +2 D#5 6 ----- ----- +3 B 4 6 ----- ----- +4 D 5 8 ----- ----- +5 ----- ----- ----- +6 G#5 8 ----- ----- +7 ----- ----- ----- +8 B 5 8 G 2 4 ----- +9 ----- ----- ----- +A D 5 8 ----- ----- +B ----- ----- ----- +C G#5 8 A#2 4 ----- +D ----- ----- ----- +E B 5 8 ----- ----- +F ----- ----- ----- +' 55 +0 D#6 ; B 2 < ----- +1 ----- ----- ----- +2 ----- ----- B 4 6 +3 ----- ----- C#5 6 +4 ----- ----- D#5 6 +5 ----- ----- E 5 6 +6 ----- ----- F#5 8 +7 ----- ----- ----- +8 ----- ----- B 4 6 +9 ----- ----- C#5 6 +A ----- ----- D 5 6 +B ----- ----- E 5 6 +C ----- ----- F#5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 56 +0 ----- ----- ----- +1 ----- ----- ----- +2 B 4 6 ----- ----- +3 C#5 6 ----- ----- +4 D#5 6 ----- ----- +5 E 5 6 ----- ----- +6 F#5 8 ----- ----- +7 ----- ----- ----- +8 B 4 6 B 2 4 ----- +9 C#5 6 ----- ----- +A D 5 6 ----- ----- +B E 5 6 ----- ----- +C F#5 6 A#2 4 ----- +D G#5 6 ----- ----- +E A#5 6 ----- ----- +F B 5 6 ----- ----- +' 57 +0 C 6 8 C 4 8 A-5 8 +1 ----- ----- ----- +2 B-5 8 B-3 8 G-5 8 +3 ----- ----- ----- +4 A-5 8 A-3 8 E-5 8 +5 ----- ----- ----- +6 E-6 8 E-4 8 B-5 8 +7 ----- ----- ----- +8 C 6 8 C 4 8 A-5 8 +9 ----- ----- ----- +A B-5 8 B-3 8 G-5 8 +B ----- ----- ----- +C C 6 8 C 4 8 A-5 8 +D ----- ----- ----- +E B-5 8 B-3 8 G-5 8 +F ----- ----- ----- +' 58 +0 A-5 8 A-3 8 E-5 8 +1 ----- ----- ----- +2 E-6 8 E-4 8 B-5 8 +3 ----- ----- ----- +4 C 6 8 C 4 8 A-5 8 +5 ----- ----- ----- +6 B-5 8 B-3 8 G-5 8 +7 ----- ----- ----- +8 C 6 8 C 4 8 A-5 8 +9 ----- ----- ----- +A A-5 8 A-3 8 D-5 8 +B ----- ----- ----- +C G-5 8 G-3 8 C 5 8 +D ----- ----- ----- +E E-5 8 G-3 8 G-4 8 +F ----- ----- ----- +' LOOP TO FRAME 8 diff --git a/music/electric_duet/notes.c b/music/electric_duet/notes.c new file mode 100644 index 00000000..bd9abe03 --- /dev/null +++ b/music/electric_duet/notes.c @@ -0,0 +1,313 @@ +#include +#include +#include +#include + +#define TWELTH_TWO 1.059463094359 + +// http://www.phy.mtu.edu/~suits/NoteFreqCalcs.html +double note_to_freq(char note, int flat, int sharp, int octave, double sub) { + + double freq=0.0; + double step=0; + + switch(note) { + case 'B': step= 2; break; + case 'A': step= 0; break; + case 'G': step=-2; break; + case 'F': step=-4; break; + case 'E': step=-5; break; + case 'D': step=-7; break; + case 'C': step=-9; break; + default: + fprintf(stderr,"Unknown note %c\n",note); + } + if (flat) step+=flat; + if (sharp) step-=sharp; + + step-=(4-octave)*12; + + step+=sub/16.0; + + freq=440.0*pow(TWELTH_TWO,step); + + return freq; +} + +/* https://sourceforge.net/p/ed2midi/code/ */ +/* From a spreadsheet from ed2midi */ +/* Ugh, ym5 changes octave on C, but looks like ED does at A */ +/* Octave 1 2 3 4 5 + A 255 128 64 32 16 + A#/B- 240 120 60 30 15 + B 228 114 57 28 14 + C 216 108 54 27 13 + C#/D- 204 102 51 25 12 + D 192 96 48 24 12 + D#/E- 180 90 45 22 11 + E 172 86 43 21 10 + F 160 80 40 20 10 + F#/G- 152 76 38 19 9 + G 144 72 36 18 9 + G#/A- 136 68 34 17 8 */ + + +/* Octave 1 2 3 4 5 6 + C 216 108 54 27 13 + C#/D- 204 102 51 25 12 + D 192 96 48 24 12 + D#/E- 180 90 45 22 11 + E 172 86 43 21 10 + F 160 80 40 20 10 + F#/G- 152 76 38 19 9 + G 144 72 36 18 9 + G#/A- 136 68 34 17 8 + A 255 128 64 32 16 + A#/B- 240 120 60 30 15 + B 228 114 57 28 14 + +*/ + + +/* Octave 1 2 3 4 5 6 + C 216 108 54 27 13 + C#/D- 204 102 51 25 12 + D 192 96 48 24 12 + D#/E- 180 90 45 22 11 + E 172 86 43 21 10 + F 160 80 40 20 10 + F#/G- 152 76 38 19 9 + G 144 72 36 18 9 + G#/A- 136 68 34 17 8 + A 255 128 64 32 16 8 + A#/B- 240 120 60 30 15 8 + B 228 114 57 28 14 7 + +*/ + +static unsigned char ed_freqs[]={ +/* A A# B C C# D D# E F F# G G# */ + 255,240,228,216,204,192,180,172,160,152,144,136, + 128,120,114,108,102,96, 90, 86, 80, 76, 72, 68, + 64, 60, 57, 54, 51, 48, 45, 43, 40, 38, 36, 34, + 32, 30, 28, 27, 25, 24, 22, 21, 20, 19, 18, 17, + 16, 15, 14, 13, 12, 12, 11, 10, 10, 9, 9, 8, + 8, 8, 7}; + +/* c1 c1 + d1 d1 + e1 e1 + f1 f1 + g1 g1 + a1 a2 + b1 b2 + c2 c2 + + */ +int note_to_ed(char note, int flat, int sharp, int octave) { + + int offset; + + switch(note) { + case 'A': offset=12; break; + case 'B': offset=14; break; + case 'C': offset=3; break; + case 'D': offset=5; break; + case 'E': offset=7; break; + case 'F': offset=8; break; + case 'G': offset=10; break; + default: + fprintf(stderr,"Unknown note %c\n",note); + return -1; + } + if (flat==1) offset--; + if (sharp==1) offset++; + if (sharp==2) offset+=2; + + offset+=((octave-1)*12); + + if (offset>63) { + fprintf(stderr,"Out of range offset %d\n",offset); + return 7; + } + + if (offset<0) { + fprintf(stderr,"Out of range offset %d\n",offset); + return 255; + } + + return ed_freqs[offset]; +} + + + +static struct note_mapping_type { + int actual; + int low; + int high; +} note_mapping[10][12]={ + +{ /* Octave 0 */ + { 16, 16, 16, }, // "C 0" + { 17, 17, 17, }, // "C#0" + { 18, 18, 18, }, // "D 0" + { 19, 19, 19, }, // "D#0" + { 20, 20, 21, }, // "E 0" + { 21, 21, 22, }, // "F 0" + { 23, 22, 23, }, // "F#0" + { 24, 24, 25, }, // "G 0" + { 26, 25, 26, }, // "G#0" + { 27, 27, 28, }, // "A 0" + { 29, 28, 29, }, // "A#0" + { 30, 30, 31, }, // "B 0" +}, +{ /* Octave 1 */ + { 32, 32, 33, }, // "C 1" + { 34, 34, 35, }, // "C#1" + { 36, 36, 37, }, // "D 1" + { 38, 38, 39, }, // "D#1" + { 41, 40, 41, }, // "E 1" + { 43, 43, 44, }, // "F 1" + { 46, 45, 46, }, // "F#1" + { 49, 48, 49, }, // "G 1" + { 51, 51, 52, }, // "G#1" + { 55, 54, 55, }, // "A 1" + { 58, 57, 58, }, // "A#1" + { 61, 61, 62, }, // "B 1" +}, +{ /* Octave 2 */ + { 65, 64, 65, }, // "C 2" + { 69, 68, 69, }, // "C#2" + { 73, 72, 73, }, // "D 2" + { 77, 77, 78, }, // "D#2" + { 82, 81, 82, }, // "E 2" + { 87, 86, 87, }, // "F 2" + { 92, 92, 93, }, // "F#2" + { 98, 97, 98, }, // "G 2" + { 103, 103, 104, }, // "G#2" + { 110, 109, 110, }, // "A 2" + { 116, 116, 117, }, // "A#2" + { 123, 123, 124, }, // "B 2" +}, +{ /* Octave 3 */ + { 130, 129, 131, }, // "C 3" + { 138, 137, 139, }, // "C#3" + { 146, 145, 147, }, // "D 3" + { 155, 154, 156, }, // "D#3" + { 164, 163, 165, }, // "E 3" + { 174, 173, 175, }, // "F 3" + { 185, 184, 186, }, // "F#3" + { 196, 195, 198, }, // "G 3" + { 207, 206, 209, }, // "G#3" + { 220, 119, 222, }, // "A 3" + { 233, 232, 235, }, // "A#3" + { 246, 245, 248, }, // "B 3" +}, +{ /* Octave 4 */ + { 261, 256, 266, }, // "C 4" + { 277, 272, 282, }, // "C#4" + { 293, 288, 298, }, // "D 4" + { 311, 306, 316, }, // "D#4" + { 329, 324, 334, }, // "E 4" + { 349, 344, 354, }, // "F 4" + { 370, 365, 375, }, // "F#4" + { 392, 387, 397, }, // "G 4" + { 415, 410, 420, }, // "G#4" + { 440, 435, 445, }, // "A 4" + { 466, 461, 471, }, // "A#4" + { 493, 488, 498, }, // "B 4" +}, +{ /* Octave 5 */ + { 523, 513, 533, }, // "C 5" + { 554, 544, 564, }, // "C#5" + { 587, 577, 597, }, // "D 5" + { 622, 612, 632, }, // "D#5" + { 659, 649, 669, }, // "E 5" + { 698, 688, 708, }, // "F 5" + { 740, 730, 750, }, // "F#5" + { 784, 774, 794, }, // "G 5" + { 830, 820, 840, }, // "G#5" + { 880, 870, 890, }, // "A 5" + { 932, 922, 942, }, // "A#5" + { 987, 977, 997, }, // "B 5" +}, +{ /* Octave 6 */ + { 1046, 1026, 1066, }, // "C 6" + { 1108, 1088, 1128, }, // "C#6" + { 1174, 1154, 1194, }, // "D 6" + { 1244, 1224, 1264, }, // "D#6" + { 1318, 1298, 1338, }, // "E 6" + { 1396, 1376, 1416, }, // "F 6" + { 1480, 1460, 1500, }, // "F#6" + { 1568, 1548, 1588, }, // "G 6" + { 1661, 1641, 1681, }, // "G#6" + { 1760, 1740, 1780, }, // "A 6" + { 1864, 1844, 1884, }, // "A#6" + { 1975, 1955, 1995, }, // "B 6" +}, +{ /* Octave 7 */ + { 2093, 2063, 2123, }, // "C 7" + { 2217, 2187, 2247, }, // "C#7" + { 2349, 2319, 2379, }, // "D 7" + { 2489, 2459, 2519, }, // "D#7" + { 2637, 2607, 2667, }, // "E 7" + { 2793, 2763, 2823, }, // "F 7" + { 2960, 2930, 2990, }, // "F#7" + { 3136, 3106, 3166, }, // "G 7" + { 3322, 3292, 3352, }, // "G#7" + { 3520, 3490, 3550, }, // "A 7" + { 3729, 3699, 3759, }, // "A#7" + { 3951, 3921, 3981, }, // "B 7" +}, +{ /* Octave 8 */ + { 4186, 4146, 4226, }, // "C 8 + { 4434, 4394, 4474, }, // "C#8 + { 4698, 4658, 5738, }, // "D 8 + { 4978, 4938, 5018, }, // "D#8 + { 5274, 5234, 5314, }, // "E 8 + { 5587, 5547, 5627, }, // "F 8 + { 5919, 5879, 5959, }, // "F#8 + { 6271, 6231, 6311, }, // "G 8 + { 6644, 6604, 6684, }, // "G#8 + { 7040, 7000, 7080, }, // "A 8 + { 7458, 7418, 7498, }, // "A#8 + { 7902, 7862, 7942, }, // "B 8 +}, +{ /* Octave 9 */ + { 8372, 8322, 8422, }, // "C 9 + { 8869, 8819, 8919, }, // "C#9 + { 9397, 9347, 9447, }, // "D 9 + { 9956, 9906, 10006, }, // "D#9 + { 10548, 10498, 10598, }, // "E 9 + { 11175, 11125, 11225, }, // "F 9 + { 11839, 11789, 11889, }, // "F#9 + { 12543, 12493, 12593, }, // "G 9 + { 13289, 13239, 13339, }, // "G#9 + { 14080, 14030, 14130, }, // "A 9 + { 14917, 14867, 14967, }, // "A#9 + { 15804, 15754, 15854, }, // "B 9 +}, +}; + +int freq_to_note(int f) { + + int octave=0,note=0; + int i,j; + + for(i=0;i<10;i++) { + if ((f>=note_mapping[i][0].low)&&(f<=note_mapping[i][11].high)) { + octave=i; + for(j=0;j<12;j++) { + if ((f>=note_mapping[i][j].low)&&(f<=note_mapping[i][j].high)) { + note=j; + } + } + break; + } + } + +// printf("Found Octave %d note %d\n",octave,note); + + return (octave*12)+note; + +} diff --git a/music/electric_duet/notes.h b/music/electric_duet/notes.h new file mode 100644 index 00000000..2a92bf2d --- /dev/null +++ b/music/electric_duet/notes.h @@ -0,0 +1,3 @@ +double note_to_freq(char note, int flat, int sharp, int octave, double sub); +int note_to_ed(char note, int flat, int sharp, int octave); +int freq_to_note(int f); diff --git a/music/electric_duet/peasant.txt b/music/electric_duet/peasant.txt new file mode 100644 index 00000000..875f1ab6 --- /dev/null +++ b/music/electric_duet/peasant.txt @@ -0,0 +1,1003 @@ +' +' TITLE: Highwind Takes to the Skies +' AUTHOR: (tracked by) Vince Weaver +' COMMENTS: by Nobuo Uematsu, From Final Fantasy VII, Arranged by Thomas Wilson +' +' LOOP: 640 +' +' BPM: 136 +' TEMPO: 6 +' FREQ: 1000000 +' IRQ: 50 +' +' LYRICS: 0 +' +' ENDHEADER +------- +' 1 +0 ----- A 3 6 ----- +1 ----- B 3 6 ----- +2 ----- C#4 6 ----- +3 ----- E 4 6 ----- +4 A 5 4 A 3 6 A 4 4 +5 ----- B 3 6 ----- +6 ----- C 4 6 ----- +7 ----- E 4 6 ----- +8 B 5 4 A 3 6 B 4 4 +9 ----- B 3 6 ----- +A ----- C 4 6 ----- +B ----- E 4 6 ----- +C E 6 4 A 3 6 E 5 4 +D ----- B 3 6 ----- +E ----- C 4 6 ----- +F ----- E 4 6 ----- +' 2 +0 D#6 4 A 3 6 D#5 4 +1 ----- B 3 6 ----- +2 ----- C#4 6 ----- +3 ----- E 4 6 ----- +4 C#6 4 A 3 6 C#5 4 +5 ----- B 3 6 ----- +6 ----- C 4 6 ----- +7 ----- E 4 6 ----- +8 B 5 4 A 3 6 B 4 4 +9 ----- B 3 6 ----- +A ----- C 4 6 ----- +B ----- E 4 6 ----- +C A 5 4 A 3 6 A 4 4 +D ----- B 3 6 ----- +E ----- C 4 6 ----- +F ----- E 4 6 ----- +' 3 +0 G 5 4 G 3 6 G 4 4 +1 ----- A 3 6 ----- +2 ----- B 3 6 ----- +3 ----- D 4 6 ----- +4 A 5 4 G 3 6 A 4 4 +5 ----- A 3 6 ----- +6 ----- B 3 6 ----- +7 ----- D 4 6 ----- +8 F#5 < G 3 6 D 4 2 +9 ----- A 3 6 ----- +A ----- B 3 6 ----- +B ----- D 4 6 ----- +C ----- G 3 6 ----- +D ----- A 3 6 ----- +E ----- B 3 6 ----- +F ----- D 4 6 ----- +' 4 +0 ----- G 3 6 C#5 2 +1 ----- A 3 6 ----- +2 ----- B 3 6 ----- +3 ----- D 4 6 ----- +4 ----- G 3 6 ----- +5 ----- A 3 6 ----- +6 ----- B 3 6 ----- +7 ----- D 4 6 ----- +8 ----- G 3 6 B 4 2 +9 ----- A 3 6 ----- +A ----- B 3 6 ----- +B ----- D 4 6 ----- +C ----- G 3 6 ----- +D ----- A 3 6 ----- +E ----- B 3 6 ----- +F ----- D 4 6 ----- +' 5 +0 ----- F 3 6 ----- +1 ----- G 3 6 ----- +2 ----- A 3 6 ----- +3 ----- C 4 6 ----- +4 B 5 4 F 3 6 B 4 4 +5 ----- G 3 6 ----- +6 ----- A 3 6 ----- +7 ----- C 4 6 ----- +8 C 6 4 F 3 6 C 5 4 +9 ----- G 3 6 ----- +A ----- A 3 6 ----- +B ----- C 4 6 ----- +C F 6 4 F 3 6 F 5 4 +D ----- G 3 6 ----- +E ----- A 3 6 ----- +F ----- C 4 6 ----- +' 6 +0 E 6 4 F 3 6 E 5 4 +1 ----- G 3 6 ----- +2 ----- A 3 6 ----- +3 ----- C 4 6 ----- +4 D 6 4 F 3 6 D 5 4 +5 ----- G 3 6 ----- +6 ----- A 3 6 ----- +7 ----- C 4 6 ----- +8 C 6 4 F 3 6 C 5 4 +9 ----- G 3 6 ----- +A ----- A 3 6 ----- +B ----- C 4 6 ----- +C B-5 4 F 3 6 B-4 4 +D ----- G 3 6 ----- +E ----- A 3 6 ----- +F ----- C 4 6 ----- +' 7 +0 A-5 4 A-3 6 C 5 2 +1 ----- B-3 6 ----- +2 ----- C 4 6 ----- +3 ----- E-4 6 ----- +4 B-5 4 A 3 6 ----- +5 ----- B 3 6 ----- +6 ----- C 4 6 ----- +7 ----- E 4 6 ----- +8 E-6 < A 3 6 B-5 4 +9 ----- B 3 6 ----- +A ----- C 4 6 ----- +B ----- E 4 6 ----- +C ----- A 3 6 D-6 4 +D ----- B 3 6 ----- +E ----- C 4 6 ----- +F ----- E 4 6 ----- +' 8 +0 ----- A-3 6 C 6 1 +1 ----- B-3 6 ----- +2 ----- C 4 6 ----- +3 ----- E-4 6 ----- +4 ----- A 3 6 ----- +5 ----- B 3 6 ----- +6 ----- C 4 6 ----- +7 ----- E 4 6 ----- +8 ----- A 3 6 ----- +9 ----- B 3 6 ----- +A ----- C 4 6 ----- +B ----- E 4 6 ----- +C ----- A 3 6 ----- +D ----- B 3 6 ----- +E ----- C 4 6 ----- +F ----- E 4 6 ----- +' 9 +0 D-5 2 D-3 1 A-4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- D-5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 10 +0 C 6 2 B-2 1 A-5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 2 ----- F 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 11 +0 ----- D-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 D-5 4 ----- A-4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- D-5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 12 +0 A-5 4 B=2 2 F-5 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 G-5 4 ----- E-5 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D-5 4 C-3 2 B=4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C E-5 4 ----- C 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 13 +0 D-5 2 D-3 1 A-4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- D-5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 14 +0 C 6 2 B-2 1 A-5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 2 ----- F 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 15 +0 ----- D-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 D-5 4 ----- A-4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- D-5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 16 +0 A-5 4 G-3 1 F 5 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 G-5 4 ----- E-5 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D-5 4 ----- B-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C E-5 4 ----- G-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 17 +0 F 5 1 F-3 2 A-4 1 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- G 3 4 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- A 3 4 ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 18 +0 ----- B-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 F 5 4 ----- A-4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 A-5 4 ----- C 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- B-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 19 +0 E-5 2 C-4 2 E-4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-4 4 G-3 4 F 4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 5 4 C 4 4 E-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 20 +0 A-4 2 C 4 2 E-4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 G-4 4 A-3 2 D-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C A-4 4 ----- E-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 21 +0 D-5 2 D-3 1 F 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- A-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 22 +0 C 6 2 B-2 1 E-5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 2 ----- D-5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 23 +0 ----- D-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 D-5 4 ----- F 4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- A-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 24 +0 A-5 4 B=2 2 F-5 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 G-5 4 ----- E-5 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D-5 4 C-3 2 B=4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C E-5 4 ----- C-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 25 +0 D-5 2 D-3 1 F 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- A-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 26 +0 C 6 2 B-3 1 E-5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 2 ----- D-5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 27 +0 ----- D-3 1 ----- +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 D-5 4 ----- F 4 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 E-5 4 ----- A-4 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C F 5 4 ----- D-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 28 +0 A-5 4 G-3 1 F 5 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 G-5 4 ----- E-5 4 +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B-5 4 ----- F 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C 6 4 ----- A-5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 29 +0 D 6 2 B 2 2 F#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 C#6 4 C#3 2 E 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 5 4 ----- D 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 30 +0 F#5 2 D 3 2 B 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B 5 2 B 2 2 D 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 31 +0 A#5 : F#3 = C#5 : +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 4 4 ----- F#4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 32 +0 C#5 4 ----- A#4 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 A 4 8 ----- C#4 8 +5 ----- ----- ----- +6 C#5 6 ----- F#4 6 +7 C#5 6 ----- F#4 6 +8 C#5 8 ----- F#4 8 +9 ----- ----- ----- +A A 4 8 ----- F#4 8 +B ----- ----- ----- +C B 4 8 ----- F#4 8 +D ----- ----- ----- +E C#5 8 ----- F#4 8 +F ----- ----- ----- +' 33 +0 D 6 2 B 2 2 F#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 C#6 4 C#3 2 E 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 5 4 ----- D 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 34 +0 F#5 2 D 3 2 B 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 B 5 2 B 2 2 D 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 35 +0 C#6 : A 3 = E 5 : +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- ----- ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 4 4 ----- E 4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 36 +0 C#5 4 ----- A#4 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 A 4 8 ----- C#4 8 +5 ----- ----- ----- +6 C#5 6 ----- A 4 6 +7 C#5 6 ----- A 4 6 +8 C#5 8 ----- A 4 8 +9 ----- ----- ----- +A B 4 8 ----- A 4 8 +B ----- ----- ----- +C C#5 8 ----- A 4 8 +D ----- ----- ----- +E D#5 8 ----- A 4 8 +F ----- ----- ----- +' 37 +0 E 6 2 C#3 2 G#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D#6 4 D#3 2 F#5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C#6 4 ----- E 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 38 +0 G#5 2 E 3 2 C#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 C#6 2 C#3 2 E 5 2 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C ----- ----- ----- +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 39 +0 B 5 : G#2 2 D#5 : +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 ----- A#2 2 ----- +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C C#5 4 ----- A#4 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 40 -- note: mistake in sheet music (# not natural) +0 D#5 4 B 2 2 B 4 4 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 B 4 8 ----- G#4 8 +5 ----- ----- ----- +6 D 5 6 ----- G#4 6 +7 D 5 6 ----- G#4 6 +8 D 5 8 C#3 2 G#4 8 +9 ----- ----- ----- +A B 4 8 ----- G#4 8 +B ----- ----- ----- +C C#5 8 ----- G#4 8 +D ----- ----- ----- +E D#5 8 ----- G#4 8 +F ----- ----- ----- +' 41 +0 D#6 2 B 2 2 F#5 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 C#6 4 C#3 2 E 5 4 +9 ----- ----- ----- +A ----- ----- ----- +B ----- ----- ----- +C B 5 4 ----- D#5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 42 +0 F#5 2 D#3 2 B 4 2 +1 ----- ----- ----- +2 ----- ----- ----- +3 ----- ----- ----- +4 ----- ----- ----- +5 ----- ----- ----- +6 ----- ----- ----- +7 ----- ----- ----- +8 D#5 6 E 3 2 B 4 6 +9 E 5 6 ----- C#5 6 +A F#5 6 ----- D 5 6 +B G#5 6 ----- E 5 6 +C A#5 6 ----- F#5 6 +D B 5 6 ----- G#5 6 +E C#5 6 ----- A 5 6 +F D#5 6 ----- B 5 6 +' 43 +0 F#6 2 F#3 < ----- +1 ----- ----- ----- +2 ----- ----- F#5 6 +3 ----- ----- G 5 6 +4 ----- ----- A#5 6 +5 ----- ----- B 5 6 +6 ----- ----- C#6 8 +7 ----- ----- ----- +8 C#6 5 ----- C#5 6 +9 ----- ----- D#5 6 +A ----- ----- E#5 6 +B ----- ----- F#5 6 +C ----- ----- A 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 44 +0 ----- ----- ----- +1 ----- ----- ----- +2 C#5 6 ----- ----- +3 A#4 6 ----- ----- +4 C#5 8 ----- ----- +5 ----- ----- ----- +6 F#5 8 ----- ----- +7 ----- ----- ----- +8 A#5 8 F#3 8 ----- +9 ----- ----- ----- +A C#5 8 E 3 8 ----- +B ----- ----- ----- +C F#5 8 D 3 8 ----- +D ----- ----- ----- +E A 5 8 C#3 8 ----- +F ----- ----- ----- +' 45 +0 B 6 2 B 2 < ----- +1 ----- ----- ----- +2 ----- ----- B 4 6 +3 ----- ----- C#5 6 +4 ----- ----- D 5 6 +5 ----- ----- E 5 6 +6 ----- ----- F#5 8 +7 ----- ----- ----- +8 F#5 5 ----- F#4 6 +9 ----- ----- G#4 6 +A ----- ----- A#4 6 +B ----- ----- B 4 6 +C ----- ----- D 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 46 +0 ----- ----- ----- +1 ----- ----- ----- +2 D 5 6 ----- ----- +3 B 4 6 ----- ----- +4 D 5 8 ----- ----- +5 ----- ----- ----- +6 F#5 8 ----- ----- +7 ----- ----- ----- +8 B 5 8 B 2 4 ----- +9 ----- ----- ----- +A D 5 8 ----- ----- +B ----- ----- ----- +C F#5 8 C#3 4 ----- +D ----- ----- ----- +E B 5 8 ----- ----- +F ----- ----- ----- +' 47 +0 D 6 2 D 3 < ----- +1 ----- ----- ----- +2 ----- ----- D 5 6 +3 ----- ----- E 5 6 +4 ----- ----- F 5 6 +5 ----- ----- G 5 6 +6 ----- ----- A 5 8 +7 ----- ----- ----- +8 A 5 5 ----- A 4 6 +9 ----- ----- B 4 6 +A ----- ----- C 5 6 +B ----- ----- D 5 6 +C ----- ----- F#5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 48 +0 ----- ----- ----- +1 ----- ----- ----- +2 D 5 6 ----- ----- +3 A 4 6 ----- ----- +4 D 5 8 ----- ----- +5 ----- ----- ----- +6 F 5 8 ----- ----- +7 ----- ----- ----- +8 A 5 8 C#3 4 ----- +9 ----- ----- ----- +A D 5 8 ----- ----- +B ----- ----- ----- +C F#5 8 B 2 4 ----- +D ----- ----- ----- +E A 5 8 ----- ----- +F ----- ----- ----- +' 49 +0 C 6 2 A 2 < ----- +1 ----- ----- ----- +2 ----- ----- A 4 6 +3 ----- ----- B 4 6 +4 ----- ----- C#5 6 +5 ----- ----- D 5 6 +6 ----- ----- E 5 8 +7 ----- ----- ----- +8 E 5 5 ----- E 4 6 +9 ----- ----- F#4 6 +A ----- ----- G#4 6 +B ----- ----- A 4 6 +C ----- ----- C#5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 50 +0 ----- ----- ----- +1 ----- ----- ----- +2 E 5 6 ----- ----- +3 C#5 6 ----- ----- +4 E 5 8 ----- ----- +5 ----- ----- ----- +6 A 5 8 ----- ----- +7 ----- ----- ----- +8 C#6 8 A 2 4 ----- +9 ----- ----- ----- +A E 5 8 ----- ----- +B ----- ----- ----- +C A 5 8 B 2 4 ----- +D ----- ----- ----- +E C#6 8 ----- ----- +F ----- ----- ----- +' 51 +0 E 5 2 C#3 < ----- +1 ----- ----- ----- +2 ----- ----- C#5 6 +3 ----- ----- D#5 6 +4 ----- ----- E 5 6 +5 ----- ----- F#5 6 +6 ----- ----- G#5 8 +7 ----- ----- ----- +8 G#5 5 ----- G#4 6 +9 ----- ----- A#4 6 +A ----- ----- B 4 6 +B ----- ----- C#5 6 +C ----- ----- E 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 52 +0 ----- ----- ----- +1 ----- ----- ----- +2 C#5 6 ----- ----- +3 G 4 6 ----- ----- +4 C#5 8 ----- ----- +5 ----- ----- ----- +6 E 5 8 ----- ----- +7 ----- ----- ----- +8 G#5 8 B 2 4 ----- +9 ----- ----- ----- +A C#5 8 ----- ----- +B ----- ----- ----- +C E 5 8 A 2 4 ----- +D ----- ----- ----- +E G#5 8 ----- ----- +F ----- ----- ----- +' 53 +0 D#6 ; G 2 < ----- +1 ----- ----- ----- +2 ----- ----- G#5 6 +3 ----- ----- A#5 6 +4 ----- ----- B 5 6 +5 ----- ----- C#6 6 +6 ----- ----- B 5 8 +7 ----- ----- ----- +8 ----- ----- D#5 6 +9 ----- ----- E#5 6 +A ----- ----- F#5 6 +B ----- ----- G#5 6 +C ----- ----- B 5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 54 +0 ----- ----- ----- +1 ----- ----- ----- +2 D#5 6 ----- ----- +3 B 4 6 ----- ----- +4 D 5 8 ----- ----- +5 ----- ----- ----- +6 G#5 8 ----- ----- +7 ----- ----- ----- +8 B 5 8 G 2 4 ----- +9 ----- ----- ----- +A D 5 8 ----- ----- +B ----- ----- ----- +C G#5 8 A#2 4 ----- +D ----- ----- ----- +E B 5 8 ----- ----- +F ----- ----- ----- +' 55 +0 D#6 ; B 2 < ----- +1 ----- ----- ----- +2 ----- ----- B 4 6 +3 ----- ----- C#5 6 +4 ----- ----- D#5 6 +5 ----- ----- E 5 6 +6 ----- ----- F#5 8 +7 ----- ----- ----- +8 ----- ----- B 4 6 +9 ----- ----- C#5 6 +A ----- ----- D 5 6 +B ----- ----- E 5 6 +C ----- ----- F#5 4 +D ----- ----- ----- +E ----- ----- ----- +F ----- ----- ----- +' 56 +0 ----- ----- ----- +1 ----- ----- ----- +2 B 4 6 ----- ----- +3 C#5 6 ----- ----- +4 D#5 6 ----- ----- +5 E 5 6 ----- ----- +6 F#5 8 ----- ----- +7 ----- ----- ----- +8 B 4 6 B 2 4 ----- +9 C#5 6 ----- ----- +A D 5 6 ----- ----- +B E 5 6 ----- ----- +C F#5 6 A#2 4 ----- +D G#5 6 ----- ----- +E A#5 6 ----- ----- +F B 5 6 ----- ----- +' 57 +0 C 6 8 C 4 8 A-5 8 +1 ----- ----- ----- +2 B-5 8 B-3 8 G-5 8 +3 ----- ----- ----- +4 A-5 8 A-3 8 E-5 8 +5 ----- ----- ----- +6 E-6 8 E-4 8 B-5 8 +7 ----- ----- ----- +8 C 6 8 C 4 8 A-5 8 +9 ----- ----- ----- +A B-5 8 B-3 8 G-5 8 +B ----- ----- ----- +C C 6 8 C 4 8 A-5 8 +D ----- ----- ----- +E B-5 8 B-3 8 G-5 8 +F ----- ----- ----- +' 58 +0 A-5 8 A-3 8 E-5 8 +1 ----- ----- ----- +2 E-6 8 E-4 8 B-5 8 +3 ----- ----- ----- +4 C 6 8 C 4 8 A-5 8 +5 ----- ----- ----- +6 B-5 8 B-3 8 G-5 8 +7 ----- ----- ----- +8 C 6 8 C 4 8 A-5 8 +9 ----- ----- ----- +A A-5 8 A-3 8 D-5 8 +B ----- ----- ----- +C G-5 8 G-3 8 C 5 8 +D ----- ----- ----- +E E-5 8 G-3 8 G-4 8 +F ----- ----- ----- +' LOOP TO FRAME 8 diff --git a/music/electric_duet/text_to_ed.c b/music/electric_duet/text_to_ed.c new file mode 100644 index 00000000..e72fc573 --- /dev/null +++ b/music/electric_duet/text_to_ed.c @@ -0,0 +1,559 @@ +/* This is a two-track format to play on the simple 1-bit speaker */ +/* Interface available on the Apple II */ + +/* https://sourceforge.net/p/ed2midi/code/ */ +/* From a spreadsheet from ed2midi */ +/* Octave 1 2 3 4 5 + A 255 128 64 32 16 + A# 240 120 60 30 15 + B 228 114 57 28 14 + C 216 108 54 27 13 + C# 204 102 51 25 12 + D 192 96 48 24 12 + D# 180 90 45 22 11 + E 172 86 43 21 10 + F 160 80 40 20 10 + F# 152 76 38 19 9 + G 144 72 36 18 9 + G# 136 68 34 17 8 +*/ + +/* ed file format */ + +/* First byte 0: ??? (0,0,0 = exit) */ + +/* First byte 1: Voice */ +/* byte1 = voice1 instrument */ +/* byte2 = voice2 instrument */ +/* Varies, bigger than 8 seem to make no difference */ + +/* Otherwise, byte0 = duration (20=quarter, 40=half) */ +/* byte1 = voice1 note */ +/* byte2 = voice2 note */ + +#define VERSION "1.0" + +#include +#include +#include +#include +#include + +#include "notes.h" + +static int debug=0; + +static int bpm=120; +static int baselen=80; +static int frames_per_line; +static int octave_adjust=0; + +static int line=0; + +static int header_version=0; + +static int note_to_length(int length) { + + int len=1; + + switch(length) { + case 0: len=(baselen*5)/2; break; // 0 = 2.5 + case 1: len=baselen; break; // 1 = 1 whole + case 2: len=baselen/2; break; // 2 = 1/2 half + case 3: len=(baselen*3)/8; break; // 3 = 3/8 dotted quarter + case 4: len=baselen/4; break; // 4 = 1/4 quarter + case 5: len=(baselen*5)/8; break; // 5 = 5/8 ? + case 8: len=baselen/8; break; // 8 = 1/8 eighth + case 9: len=(baselen*3)/16; break; // 9 = 3/16 dotted eighth + case 6: len=baselen/16; break; // 6 = 1/16 sixteenth + case 10: len=(baselen*3)/4; break; // : = 3/4 dotted half + case 11: len=(baselen*9)/8; break; // ; = 9/8 dotted half + dotted quarter + case 12: len=(baselen*3)/2; break; // < = 3/2 dotted whole + case 13: len=(baselen*2); break; // = = 2 double whole + default: + fprintf(stderr,"Unknown length %d, line %d\n", + length,line); + } + + return len; +} + +struct note_type { + unsigned char which; + unsigned char note; + int sharp,flat; + int octave; + int len; + int enabled; + int freq; + int length; + int left; + int ed_freq; +}; + + + +static int get_note(char *string, int sp, struct note_type *n, int line) { + + int freq; + int ch; + +// fprintf(stderr,"VMW: Entering, sp=%d\n",sp); + + /* Skip white space */ + while((string[sp]==' ' || string[sp]=='\t')) sp++; + + if (string[sp]=='\n') return -1; + + /* return early if no change */ + ch=string[sp]; + +// fprintf(stderr,"VMW: %d %d\n",ch,sp); + + if (ch=='-') { + if (header_version==0) return sp+6; + else { + return sp+11; + } + } + + /* get note info */ + n->sharp=0; + n->flat=0; + n->ed_freq=0; + n->note=ch; + sp++; + if (string[sp]==' ') ; + else if (string[sp]=='#') n->sharp=1; + else if (string[sp]=='-') n->flat=1; + else if (string[sp]=='=') n->flat=2; + else { + fprintf(stderr,"Unknown note modifier %c, line %d:%d\n", + string[sp],line,sp); + fprintf(stderr,"String: %s\n",string); + } +// printf("Sharp=%d Flat=%d\n",n->sharp,n->flat); + sp++; + n->octave=string[sp]-'0'; + sp++; + sp++; + n->len=string[sp]-'0'; + sp++; + + + if (n->note!='-') { + + freq=note_to_ed(n->note,n->flat,n->sharp, + n->octave+octave_adjust); + + if (debug) printf("(%c) %c%c L=%d O=%d f=%d\n", + n->which, + n->note, + n->sharp?'#':' ', + n->len, + n->octave, + freq); + + n->ed_freq=freq; + n->enabled=1; + n->length=note_to_length(n->len); + n->left=n->length-1; + + if (n->length<=0) { + printf("Error line %d\n",line); + exit(-1); + } + } + else { + n->ed_freq=0; + } + + if (header_version==2) sp+=6; + + return sp; +} + +static int get_string(char *string, char *key, char *output, int strip_linefeed) { + + char *found; + + found=strstr(string,key); + found=found+strlen(key); + + /* get rid of leading whitespace */ + while(1) { + if ((*found==' ') || (*found=='\t')) found++; + else break; + } + + strcpy(output,found); + + /* remove trailing linefeed */ + if (strip_linefeed) output[strlen(output)-1]=0; + + return 0; + +} + +static void print_help(int just_version, char *exec_name) { + + printf("\ntext_to_ed version %s by Vince Weaver \n\n",VERSION); + if (just_version) exit(0); + + printf("This created Electric Duet files\n\n"); + + printf("Usage:\n"); + printf("\t%s [-h] [-v] [-d] [-o X] [-i X] textfile outbase\n\n", + exec_name); + printf("\t-h: this help message\n"); + printf("\t-v: version info\n"); + printf("\t-d: print debug messages\n"); + printf("\t-o: Offset octave by X\n"); + printf("\t-i: set second instrument to X\n"); + + exit(0); +} + + +int main(int argc, char **argv) { + + char string[BUFSIZ]; + char *result; + char ed_filename[BUFSIZ],lyrics_filename[BUFSIZ],*in_filename; + char temp[BUFSIZ]; + FILE *ed_file,*lyrics_file,*in_file=NULL; + //int attributes=0; + int loop=0,i; + int sp,external_frequency,irq; + struct note_type a,b,c; + int copt; + + // Instruments 0=square + int voice1=0,voice2=0; + + char song_name[BUFSIZ]; + char author_name[BUFSIZ]; + char comments[BUFSIZ]; + char *comments_ptr=comments; + + unsigned char sharp_char[]=" #-="; + + /* Parse command line arguments */ + while ((copt = getopt(argc, argv, "dhvo:i:"))!=-1) { + switch (copt) { + case 'd': + /* Debug messages */ + printf("Debug enabled\n"); + debug=1; + break; + case 'h': + /* help */ + print_help(0,argv[0]); + break; + case 'v': + /* version */ + print_help(1,argv[0]); + break; + case 'o': + /* octave offset */ + octave_adjust=atoi(optarg); + break; + case 'i': + /* instrument to use */ + voice1=atoi(optarg); + break; + default: + print_help(0,argv[0]); + break; + } + } + + if (argv[optind]!=NULL) { + /* Open the input file */ + if (argv[optind][0]=='-') { + in_file=stdin; + } + else { + in_filename=strdup(argv[optind]); + in_file=fopen(in_filename,"r"); + if (in_file==NULL) { + fprintf(stderr,"Couldn't open %s\n",in_filename); + return -1; + } + } + } + + if (optind+1>=argc) { + fprintf(stderr,"Error, need outfile\n"); + exit(0); + } + + + + /* Open the output/lyrics files */ + sprintf(ed_filename,"%s.ed",argv[optind+1]); + sprintf(lyrics_filename,"%s.edlyrics",argv[optind+1]); + + ed_file=fopen(ed_filename,"w"); + if (ed_file==NULL) { + fprintf(stderr,"Couldn't open %s\n",ed_filename); + return -1; + } + + lyrics_file=fopen(lyrics_filename,"w"); + if (lyrics_file==NULL) { + fprintf(stderr,"Couldn't open %s\n",lyrics_filename); + return -1; + } + + + /* Get the info for the header */ + + while(1) { + result=fgets(string,BUFSIZ,in_file); + if (result==NULL) break; + line++; + if (strstr(string,"ENDHEADER")) break; + if (strstr(string,"HEADER:")) { + get_string(string,"HEADER:",temp,1); + header_version=atoi(temp); + printf("Found header version %d\n",header_version); + } + if (strstr(string,"TITLE:")) { + get_string(string,"TITLE:",song_name,1); + } + if (strstr(string,"AUTHOR:")) { + get_string(string,"AUTHOR:",author_name,1); + } + if (strstr(string,"COMMENTS:")) { + get_string(string,"COMMENTS:",comments_ptr,0); + comments_ptr=&comments[strlen(comments)]; + } + if (strstr(string,"BPM:")) { + get_string(string,"BPM:",temp,1); + bpm=atoi(temp); + } + if (strstr(string,"FREQ:")) { + get_string(string,"FREQ:",temp,1); + external_frequency=atoi(temp); + } + if (strstr(string,"IRQ:")) { + get_string(string,"IRQ:",temp,1); + irq=atoi(temp); + } + if (strstr(string,"LOOP:")) { + get_string(string,"LOOP:",temp,1); + loop=atoi(temp); + } + + } + + if (bpm==115) { + baselen=80; + } + else if (bpm==120) { // 2Hz, 500ms, 80x=500, x=6.25, should be 80 + baselen=120; + } + else if (bpm==136) { // 2.3Hz, 440ms, should be 70 + baselen=70; + } + else if (bpm==160) {// 2.66Hz, 375ms, should be 60 + baselen=60; + } + else if (bpm==250) { + baselen=50; // eyeballed + } + else { + fprintf(stderr,"Warning! Unusual BPM of %d\n",bpm); + baselen=80; + } + + frames_per_line=baselen/16; + + a.which='A'; b.which='B'; c.which='C'; + + int first=1; + int a_last=0,b_last=0,same_count=0; + int a_len=0,b_len=0,a_freq=0,b_freq=0; + int frame=0,lyric=0; + int lyric_line=1; + + fprintf(ed_file,"%c%c%c",1,voice1,voice2); + + while(1) { + result=fgets(string,BUFSIZ,in_file); + if (result==NULL) break; + line++; + + a.ed_freq=0; + b.ed_freq=0; + a.length=0; + b.length=0; + + /* skip comments */ + if (string[0]=='\'') continue; + if (string[0]=='-') continue; + if (string[0]=='*') continue; + + sp=0; + + /* Skip line number */ + while((string[sp]!=' ' && string[sp]!='\t')) sp++; + + sp=get_note(string,sp,&a,line); + if (sp!=-1) sp=get_note(string,sp,&b,line); + if (sp!=-1) sp=get_note(string,sp,&c,line); + + /* handle lyrics */ + if ((sp!=-1) && (string[sp]!='\n') && (string[sp]!=0)) { + fprintf(lyrics_file,"; %d: %s",frame,&string[sp]); + while((string[sp]==' ' || string[sp]=='\t')) sp++; + if (string[sp]!='\n') { + fprintf(lyrics_file,".byte\t$%02X",lyric_line&0xff); + + /* get to first quote */ + while(string[sp]!='\"') sp++; + sp++; + + /* stop at second quote */ + while(string[sp]!='\"') { + if (string[sp]=='\\') { + sp++; + /* Ignore if we have LED panel */ + if (string[sp]=='i') { + //printf(",$%02X",10); + } + /* form feed */ + else if (string[sp]=='f') { + fprintf(lyrics_file,",$%02X",12); + } + /* Vertical tab */ + else if (string[sp]=='v') { + fprintf(lyrics_file,",$%02X",11); + } + else if (string[sp]=='n') { + fprintf(lyrics_file,",$%02X",13|0x80); + } + else if ((string[sp]>='0') && + (string[sp]<=':')) { + fprintf(lyrics_file,",$%02X",string[sp]-'0'); + } + else { + printf("UNKNOWN ESCAPE %d\n",string[sp]); + } + sp++; + continue; + } + fprintf(lyrics_file,",$%02X",string[sp]|0x80); + sp++; + } + fprintf(lyrics_file,",$00\n"); + + + +// fprintf(lyrics_file," %s",&string[sp]); +// printf("%s",&string[sp]); + } + lyric=1; + + } + + + if ((a.ed_freq!=0)||(b.ed_freq!=0)) { + if (debug) { + printf("%d: ",frame); + printf("%c%c%d %d (%d,%d) |%d %d %d %c|\t", + a.note,sharp_char[a.sharp+2*a.flat],a.octave, + a.len,a.ed_freq,a.length, + a.sharp,a.flat,a.sharp+2*a.flat, + sharp_char[2]); + + printf("%c%c%d %d (%d,%d)\n", + b.note,sharp_char[b.sharp+2*b.flat],b.octave, + b.len,b.ed_freq,b.length); + } + } + + if (a.length) a_len=a.length; + if (b.length) b_len=b.length; + if (a.ed_freq) { + a_freq=a.ed_freq; + } + if (b.ed_freq) { + b_freq=b.ed_freq; + } + + if (first) { + a_last=a_freq; + b_last=b_freq; + first=0; + } + + for(i=0;i250)) { + + + /* Avoid changing instrument by accident */ + /* Also keep lyrics in sync */ + if (same_count<2) { + same_count=2; + } + lyric_line++; + + fprintf(ed_file,"%c%c%c",same_count,a_last,b_last); + if (debug) { + printf("*** %x %x %x\n",same_count,a_last,b_last); + } + same_count=0; + + } + + same_count++; + + if (a_len) a_len--; + if (b_len) b_len--; + + a_last=a_freq; + b_last=b_freq; + lyric=0; + + } + frame++; + + } + if (same_count==1) same_count++; + fprintf(ed_file,"%c%c%c",same_count,a_last,b_last); + fprintf(ed_file,"%c%c%c",0,0,0); // EOF? + + fclose(ed_file); + fclose(lyrics_file); + + (void) irq; + (void) loop; + (void) external_frequency; + + return 0; +} +