https://youtu.be/XmreeAXaim8
Code for anyone who wants to take a look:
Code: Select all
\ Define AY-3-8912 constants
\ The output frequency is equal to the clock frequency divided by 16 and then
\ divided by the number written to the course and fine pitch registers. So we
\ can use algebra to figure out the register value for a specific pitch.
\ Freq = 1,000,000 / 16 / Reg
\ Freq = 62500 / Reg
\ Reg = 62500 / Freq
\ Example Reg = 62500 / 440(A) = 142
3823 CONSTANT C_0
3406 CONSTANT D_0
3034 CONSTANT E_0
2863 CONSTANT F_0
2551 CONSTANT G_0
2273 CONSTANT A_0
2025 CONSTANT B_0
1911 CONSTANT C_1
1703 CONSTANT D_1
1517 CONSTANT E_1
1432 CONSTANT F_1
1278 CONSTANT G_1
1136 CONSTANT A_1
1012 CONSTANT B_1
956 CONSTANT C_2
851 CONSTANT D_2
758 CONSTANT E_2
716 CONSTANT F_2
638 CONSTANT G_2
568 CONSTANT A_2
506 CONSTANT B_2
478 CONSTANT C_3
426 CONSTANT D_3
379 CONSTANT E_3
358 CONSTANT F_3
319 CONSTANT G_3
284 CONSTANT A_3
253 CONSTANT B_3
239 CONSTANT C_4
213 CONSTANT D_4
190 CONSTANT E_4
179 CONSTANT F_4
159 CONSTANT G_4
142 CONSTANT A_4
127 CONSTANT B_4
119 CONSTANT C_5
107 CONSTANT D_5
95 CONSTANT E_5
90 CONSTANT F_5
80 CONSTANT G_5
71 CONSTANT A_5
64 CONSTANT B_5
59 CONSTANT C_6
HEX
7F00 CONSTANT WRITE
7F01 CONSTANT LATCH
0 CONSTANT AFREQ
2 CONSTANT BFREQ
4 CONSTANT CFREQ
6 CONSTANT NOISE
7 CONSTANT MIXER
8 CONSTANT VA
9 CONSTANT VB
A CONSTANT VC
B CONSTANT FL
C CONSTANT FH
D CONSTANT ES
E CONSTANT IA
F CONSTANT IB
\ Stores the stack value into VA
: VA!
VA LATCH C!
WRITE C! ;
\ Stores the stack value into VB
: VB!
VB LATCH C!
WRITE C! ;
\ Stores the stack value into VB
: VC!
VC LATCH C!
WRITE C! ;
: MIXER!
MIXER LATCH C!
WRITE C! ;
\ Deposits (value register) from stack to AY-3-8912
: REG!
2DUP
LATCH C!
FF AND
WRITE C!
1+
LATCH C!
8 RSHIFT
WRITE C! ;
\ holds a note
: DELAY
950 0 DO
LOOP ;
DECIMAL
\ Now use these functions to produce sound
: ARPEGGIO_UP
A_4 AFREQ REG!
DELAY
C_5 AFREQ REG!
DELAY
E_5 AFREQ REG!
DELAY
G_5 AFREQ REG!
DELAY ;
: ARPEGGIO_DOWN
A_5 AFREQ REG!
DELAY
G_5 AFREQ REG!
DELAY
E_5 AFREQ REG!
DELAY
C_5 AFREQ REG!
DELAY ;
: MEASURE1
\ Start with the pedal tones
B_3 BFREQ REG!
E_3 CFREQ REG!
2 VB!
2 VC!
\ Play the arpeggios sliently to count time.
0 VA!
ARPEGGIO_UP
ARPEGGIO_DOWN
ARPEGGIO_UP
ARPEGGIO_DOWN ;
: MEASURE2
\ Now turn off the pedal tones and play the arpeggios twice aloud.
0 VB!
0 VC!
2 VA!
ARPEGGIO_UP
ARPEGGIO_DOWN
ARPEGGIO_UP
ARPEGGIO_DOWN ;
: MEASURE3
\ Start with the pedal tones
E_2 BFREQ REG!
E_1 CFREQ REG!
2 VB!
2 VC!
2 VA!
ARPEGGIO_UP
ARPEGGIO_DOWN
ARPEGGIO_UP
ARPEGGIO_DOWN ;
: MEASURE4
E_2 BFREQ REG!
B_2 CFREQ REG!
2 VB!
2 VC!
ARPEGGIO_UP
G_4 BFREQ REG!
ARPEGGIO_DOWN
ARPEGGIO_UP
ARPEGGIO_DOWN ;
: MEASURE5
0 VB!
0 VC!
ARPEGGIO_UP
ARPEGGIO_DOWN
ARPEGGIO_UP
D_2 BFREQ REG!
2 VB!
ARPEGGIO_DOWN ;
: MEASURE6
0 VB!
0 VC!
ARPEGGIO_UP
ARPEGGIO_DOWN
D_2 BFREQ REG!
2 VB!
A_4 AFREQ REG!
DELAY
C_5 AFREQ REG!
DELAY
E_5 AFREQ REG!
DELAY
B_2 BFREQ REG!
G_5 AFREQ REG!
DELAY
0 VB!
A_5 AFREQ REG!
DELAY
G_5 AFREQ REG!
DELAY
E_5 AFREQ REG!
DELAY
2 VB!
C_5 AFREQ REG!
DELAY ;
: MEASURE7
D_2 BFREQ REG!
2 VB!
0 VC!
2 VA!
ARPEGGIO_UP
ARPEGGIO_DOWN
ARPEGGIO_UP
ARPEGGIO_DOWN ;
: MEASURE8
G_3 BFREQ REG!
B_2 CFREQ REG!
2 VB!
2 VC!
2 VA!
ARPEGGIO_UP
ARPEGGIO_DOWN
ARPEGGIO_UP
ARPEGGIO_DOWN ;
: MEASURE9
B_2 BFREQ REG!
G_2 CFREQ REG!
2 VB!
2 VC!
2 VA!
ARPEGGIO_UP
G_3 BFREQ REG!
D_3 CFREQ REG!
ARPEGGIO_DOWN
ARPEGGIO_UP
ARPEGGIO_DOWN ;
: MEASURE10
G_3 BFREQ REG!
D_3 CFREQ REG!
2 VB!
2 VC!
2 VA!
ARPEGGIO_UP
ARPEGGIO_DOWN
F_3 BFREQ REG!
0 VC!
ARPEGGIO_UP
D_3 BFREQ REG!
ARPEGGIO_DOWN ;
: MEASURE11
C_4 AFREQ REG!
C_3 BFREQ REG!
D_3 CFREQ REG!
2 VB!
2 VC!
2 VA!
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
1 VB!
1 VC!
1 VA!
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY ;
: MEASURE12
2 VA!
0 VB!
0 VC!
C_4 AFREQ REG!
DELAY
E_4 AFREQ REG!
DELAY
G_4 AFREQ REG!
DELAY
A_4 AFREQ REG!
DELAY
G_4 AFREQ REG!
DELAY
E_4 AFREQ REG!
DELAY
C_4 AFREQ REG!
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY
DELAY ;
: SONG
\ Set up the volume and mixer.
248 MIXER!
MEASURE1
MEASURE2
MEASURE2
MEASURE3
MEASURE2
MEASURE4
MEASURE5
MEASURE3
MEASURE5
MEASURE3
MEASURE6
MEASURE7
MEASURE2
MEASURE8
MEASURE9
MEASURE10
MEASURE11
MEASURE12
0 VB!
0 VC!
0 VA! ;