Commit bb19bd3

Nick committed on
Work on multiple patterns, added orders
commit bb19bd3284f98b2c8ddb7d6032d6ab2570b240cc parent 70c4eb4
6 changed files +405−230
ModifiedUnitMain.lfm +2−2
@@ -1,7 +1,7 @@
1 object frmGameboy: TfrmGameboy 1 object frmGameboy: TfrmGameboy
2 Left = 1519 2 Left = 3304
3 Height = 354 3 Height = 354
4 Top = 129 4 Top = 337
5 Width = 318 5 Width = 318
6 Caption = 'Gameboy' 6 Caption = 'Gameboy'
7 ClientHeight = 324 7 ClientHeight = 324
ModifiedUnitMain.pas +53−57
@@ -14,7 +14,7 @@ unit UnitMain;
14 interface 14 interface
15 15
16 uses 16 uses
17 Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 17 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
18 lcl_out, vars, z80cpu, mainloop, machine, debugger, sound, 18 lcl_out, vars, z80cpu, mainloop, machine, debugger, sound,
19 StdCtrls, ExtCtrls, ComCtrls, Menus; 19 StdCtrls, ExtCtrls, ComCtrls, Menus;
20 20
@@ -130,15 +130,14 @@ type
130 { Private-Deklarationen} 130 { Private-Deklarationen}
131 fullwindow: boolean; 131 fullwindow: boolean;
132 FDiff: integer; // Caption Height 132 FDiff: integer; // Caption Height
133 RomFile: String; 133 RomFileName: String;
134 134
135 procedure Emulation; 135 procedure Emulation(var msg: TMessage); message wm_user;
136 procedure SetWindow; 136 procedure SetWindow;
137 procedure LoadRom(Rom: String); 137 procedure LoadRom(Rom: String);
138 138
139 procedure ShowCaption; 139 procedure ShowCaption;
140 procedure RemoveCaption; 140 procedure RemoveCaption;
141
142 public 141 public
143 { Public-Deklarationen} 142 { Public-Deklarationen}
144 timervar: byte; 143 timervar: byte;
@@ -206,12 +205,17 @@ const
206 CyclesPerFrame : Integer = 70224; 205 CyclesPerFrame : Integer = 70224;
207 TimePerFrame: Double = 1.0 / 60.0; 206 TimePerFrame: Double = 1.0 / 60.0;
208 207
209 procedure TfrmGameboy.Emulation; 208 procedure TfrmGameboy.Emulation(var Msg: TMessage);
210 var 209 var
211 li: Large_Integer; 210 li: Large_Integer;
212 tickFreq, cycles: Integer; 211 tickFreq, cycles: Integer;
213 frameStart, frameEnd: Integer; 212 frameStart, frameEnd: Integer;
214 frameElapsedInSec: Double; 213 frameElapsedInSec: Double;
214 function GetCounter: Integer;
215 begin
216 QueryPerformanceCounter(@li);
217 Result := li.QuadPart
218 end;
215 begin 219 begin
216 lastTime := 0; 220 lastTime := 0;
217 221
@@ -219,8 +223,7 @@ begin
219 223
220 QueryPerformanceFrequency(@li); 224 QueryPerformanceFrequency(@li);
221 tickFreq := li.QuadPart; 225 tickFreq := li.QuadPart;
222 QueryPerformanceCounter(@li); 226 FrameStart := GetCounter;
223 frameStart := li.QuadPart;
224 227
225 repeat 228 repeat
226 application.ProcessMessages; 229 application.ProcessMessages;
@@ -230,10 +233,8 @@ begin
230 while f_stopped do 233 while f_stopped do
231 application.ProcessMessages; 234 application.ProcessMessages;
232 235
233 frameEnd := 0; 236 FrameStart := GetCounter;
234 237 frameEnd := 0
235 QueryPerformanceCounter(@li);
236 frameStart := li.QuadPart;
237 end; 238 end;
238 239
239 while (cycles < CyclesPerFrame) do 240 while (cycles < CyclesPerFrame) do
@@ -242,11 +243,9 @@ begin
242 cycles -= CyclesPerFrame; 243 cycles -= CyclesPerFrame;
243 244
244 repeat 245 repeat
245 QueryPerformanceCounter(@li); 246 FrameEnd := GetCounter;
246 frameEnd := li.QuadPart;
247 247
248 frameElapsedInSec := (frameEnd - frameStart) / tickFreq; 248 frameElapsedInSec := (frameEnd - frameStart) / tickFreq;
249 sleep(1);
250 until (frameElapsedInSec > TimePerFrame) and (not SoundBufferTooFull); 249 until (frameElapsedInSec > TimePerFrame) and (not SoundBufferTooFull);
251 250
252 frameStart := frameEnd; 251 frameStart := frameEnd;
@@ -255,6 +254,8 @@ end;
255 254
256 procedure TfrmGameboy.LoadRom(Rom: String); 255 procedure TfrmGameboy.LoadRom(Rom: String);
257 begin 256 begin
257 RomFileName := Rom;
258
258 f_stopped := True; 259 f_stopped := True;
259 load(Rom); 260 load(Rom);
260 statusbar.Panels[2].Text := getcompany; 261 statusbar.Panels[2].Text := getcompany;
@@ -266,8 +267,6 @@ begin
266 gb_speed := 1; 267 gb_speed := 1;
267 loadstat.Enabled := True; 268 loadstat.Enabled := True;
268 savestat.Enabled := True; 269 savestat.Enabled := True;
269
270 RomFile := Rom;
271 end; 270 end;
272 271
273 procedure TfrmGameboy.FileOpenClick(Sender: TObject); 272 procedure TfrmGameboy.FileOpenClick(Sender: TObject);
@@ -306,12 +305,10 @@ begin
306 305
307 frmGameboy.DoubleBuffered := True; 306 frmGameboy.DoubleBuffered := True;
308 SetPaintBox(PaintBox1); 307 SetPaintBox(PaintBox1);
308 postmessage(handle, wm_user, 0, 0);
309 309
310 //postmessage(handle, wm_user, 0, 0);
311 if ParamCount >= 1 then 310 if ParamCount >= 1 then
312 LoadRom(ParamStr(1)); 311 LoadRom(ParamStr(1));
313
314 Emulation;
315 end; 312 end;
316 313
317 procedure TfrmGameboy.Exit1Click(Sender: TObject); 314 procedure TfrmGameboy.Exit1Click(Sender: TObject);
@@ -331,6 +328,7 @@ begin
331 f_stopped := not f_stopped; 328 f_stopped := not f_stopped;
332 pause1.Checked := f_stopped; 329 pause1.Checked := f_stopped;
333 end; 330 end;
331 Ord('R'): LoadRom(RomFileName);
334 VK_UP: k_up := 0; 332 VK_UP: k_up := 0;
335 VK_DOWN: k_down := 0; 333 VK_DOWN: k_down := 0;
336 VK_LEFT: k_left := 0; 334 VK_LEFT: k_left := 0;
@@ -369,7 +367,6 @@ begin
369 VK_DOWN: k_down := 1; 367 VK_DOWN: k_down := 1;
370 VK_LEFT: k_left := 1; 368 VK_LEFT: k_left := 1;
371 VK_RIGHT: k_right := 1; 369 VK_RIGHT: k_right := 1;
372 Ord('R'): LoadRom(RomFile);
373 end; 370 end;
374 end; 371 end;
375 372
@@ -402,44 +399,43 @@ begin
402 end; 399 end;
403 400
404 procedure TfrmGameboy.setPriority(Sender: TObject); 401 procedure TfrmGameboy.setPriority(Sender: TObject);
402 var
403 ProcessID: DWORD;
404 ProcessHandle: THandle;
405 Priority: integer;
405 begin 406 begin
406 //var 407 { HIGH_PRIORITY_CLASS,
407 // ProcessID: DWORD; 408 IDLE_PRIORITY_CLASS,
408 // ProcessHandle: THandle; 409 NORMAL_PRIORITY_CLASS
409 // Priority: integer; 410 REALTIME_PRIORITY_CLASS}
410 //begin 411 {THREAD_PRIORITY_ABOVE_NORMAL,
411 //{ HIGH_PRIORITY_CLASS, 412 THREAD_PRIORITY_BELOW_NORMAL,
412 // IDLE_PRIORITY_CLASS, 413 THREAD_PRIORITY_HIGHEST,
413 // NORMAL_PRIORITY_CLASS 414 THREAD_PRIORITY_IDLE,
414 // REALTIME_PRIORITY_CLASS} 415 THREAD_PRIORITY_LOWEST,
415 //{THREAD_PRIORITY_ABOVE_NORMAL, 416 THREAD_PRIORITY_NORMAL,
416 // THREAD_PRIORITY_BELOW_NORMAL, 417 THREAD_PRIORITY_TIME_CRITICAL}
417 // THREAD_PRIORITY_HIGHEST, 418
418 // THREAD_PRIORITY_IDLE, 419 priority1.Checked := False;
419 // THREAD_PRIORITY_LOWEST, 420 priority2.Checked := False;
420 // THREAD_PRIORITY_NORMAL, 421 priority3.Checked := False;
421 // THREAD_PRIORITY_TIME_CRITICAL} 422 priority4.Checked := False;
422 // 423 tmenuitem(Sender).Checked := True;
423 // priority1.Checked := False; 424
424 // priority2.Checked := False; 425 if Sender = priority1 then
425 // priority3.Checked := False; 426 priority := IDLE_PRIORITY_CLASS;
426 // priority4.Checked := False; 427 if Sender = priority2 then
427 // tmenuitem(Sender).Checked := True; 428 priority := NORMAL_PRIORITY_CLASS;
428 // 429 if Sender = priority3 then
429 // if Sender = priority1 then 430 priority := HIGH_PRIORITY_CLASS;
430 // priority := IDLE_PRIORITY_CLASS; 431 if Sender = priority4 then
431 // if Sender = priority2 then 432 priority := REALTIME_PRIORITY_CLASS;
432 // priority := NORMAL_PRIORITY_CLASS; 433
433 // if Sender = priority3 then 434 ProcessID := GetCurrentProcessID;
434 // priority := HIGH_PRIORITY_CLASS; 435 ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION, False, ProcessID);
435 // if Sender = priority4 then 436 SetPriorityClass(ProcessHandle, Priority);
436 // priority := REALTIME_PRIORITY_CLASS; 437 { ThreadHandle := GetCurrentThread;
437 // 438 SetThreadPriority(ThreadHandle, THREAD_PRIORITY_HIGHEST);}
438 // ProcessID := GetCurrentProcessID;
439 // ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION, False, ProcessID);
440 // SetPriorityClass(ProcessHandle, Priority);
441 //{ ThreadHandle := GetCurrentThread;
442 // SetThreadPriority(ThreadHandle, THREAD_PRIORITY_HIGHEST);}
443 end; 439 end;
444 440
445 procedure TfrmGameboy.setResolution(Sender: TObject); 441 procedure TfrmGameboy.setResolution(Sender: TObject);
Modifiedconstants.inc +1−1
@@ -72,4 +72,4 @@ G8 EQU 67
72 G#8 EQU 68 72 G#8 EQU 68
73 A8 EQU 69 73 A8 EQU 69
74 A#8 EQU 70 74 A#8 EQU 70
75 B8 EQU 71 75 B8 EQU 71
Modifieddriver.z80 +219−170
@@ -12,6 +12,12 @@ CANVAS_WIDTH_TILES EQU 32
12 SCREEN_HEIGHT_TILES EQU 18 12 SCREEN_HEIGHT_TILES EQU 18
13 CANVAS_HEIGHT_TILES EQU 32 13 CANVAS_HEIGHT_TILES EQU 32
14 14
15 PATTERN_LENGTH EQU 64
16 TICKS EQU 7
17
18 ;; Macros
19
20
15 ; $0000 - $003F: RST handlers. 21 ; $0000 - $003F: RST handlers.
16 22
17 SECTION "restarts", ROM0[$0000] 23 SECTION "restarts", ROM0[$0000]
@@ -94,172 +100,78 @@ DS 1
94 ; $0144 - $0145: "New" Licensee Code, a two character name. 100 ; $0144 - $0145: "New" Licensee Code, a two character name.
95 DB "NF" 101 DB "NF"
96 102
97 SECTION "Shit", ROM0 103 SECTION "Song Data", ROM0
98 sequence: 104 order_cnt: db 8
99 db A#5 105 order1: dw unreal, lunawaves, lunawaves, unreal
100 db A#4 106 order2: dw lunawaves, unreal, unreal, lunawaves
101 db F5 107 order3: dw lunawaves
102 db A#5 108 order4: dw
103 db G#5 109
104 db A#4 110 lunawaves:
105 db F5 111 include "lunawaves.inc"
106 db G#5 112 unreal:
107 db G5 113 include "unreal.inc"
108 db A#4 114
109 db D#5 115 SECTION "Playback variables", WRAM0
110 db G5 116 pattern1: dw
111 db G#5 117 pattern2: dw
112 db A#4 118 pattern3: dw
113 db F5 119 pattern4: dw
114 db G#5 120
115 db A#5 121 current_order: dw
116 db A#4 122
117 db F5 123 row: ds 1
118 db A#5
119 db G#5
120 db A#4
121 db F5
122 db G#5
123 db G5
124 db A#4
125 db D#5
126 db G5
127 db G#5
128 db A#4
129 db F5
130 db G#5
131 db A#5
132 db A#4
133 db F5
134 db A#5
135 db G#5
136 db A#4
137 db F5
138 db G#5
139 db G5
140 db A#4
141 db D#5
142 db G5
143 db G#5
144 db A#4
145 db F5
146 db G#5
147 db A#5
148 db A#4
149 db F5
150 db A#5
151 db G#5
152 db A#4
153 db F5
154 db G#5
155 db G5
156 db A#4
157 db D#5
158 db G5
159 db G#5
160 db A#4
161 db F5
162 db G#5
163
164
165 db F4
166 db G#4
167 db C5
168 db F5
169 db G#5
170 db F5
171 db C5
172 db G#4
173 db F4
174 db G#4
175 db C5
176 db F5
177 db G#5
178 db F5
179 db C5
180 db G#4
181 db F4
182 db C5
183 db D#5
184 db G#5
185 db C6
186 db G#5
187 db D#5
188 db C5
189 db G#4
190 db C5
191 db D#5
192 db G#5
193 db C6
194 db G#5
195 db D#5
196 db C5
197 db A#4
198 db D5
199 db F5
200 db A#5
201 db D6
202 db A#5
203 db F5
204 db D5
205 db A#4
206 db D5
207 db F5
208 db A#5
209 db D6
210 db A#5
211 db F5
212 db D5
213 db F4
214 db C5
215 db F5
216 db C6
217 db F6
218 db C6
219 db F5
220 db C5
221 db F4
222 db C5
223 db F5
224 db C6
225 db F6
226 db C6
227 db F5
228 db C5
229
230 SECTION "Ram Shit", WRAM0
231 counter: ds 1
232 tick: ds 1 124 tick: ds 1
233 125
234 ; Initialization and whatnot 126 ; Initialization
235 SECTION "main", ROM0[$0150] 127 SECTION "main", ROM0[$0150]
236 di 128 jp _init
129
130 _paint_tile:
131 ld a, b
132 ld [hl+], a
133 ld a, c
134 ld [hl+], a
135 ret
237 136
137 _init:
238 ; Set LCD palette for grayscale mode; yes, it has a palette 138 ; Set LCD palette for grayscale mode; yes, it has a palette
239 ld a, %11100100 139 ld a, %11100100
240 ld [$FF00+$47], a 140 ld [$FF00+$47], a
241 141
242 ;; Fill with vertical bars 142 ;; Fill with pattern
243 ld hl, $8000 143 ld hl, $8000
244 ld bc, `01201201 144 ld bc, `10000000
245 REPT 8 145 call _paint_tile
246 ld a, b 146 ld bc, `01000000
247 ld [hl+], a 147 call _paint_tile
248 ld a, c 148 ld bc, `00100000
249 ld [hl+], a 149 call _paint_tile
250 ENDR 150 ld bc, `00010000
151 call _paint_tile
152 ld bc, `00001000
153 call _paint_tile
154 ld bc, `00000100
155 call _paint_tile
156 ld bc, `00000010
157 call _paint_tile
158 ld bc, `00000001
159 call _paint_tile
251 160
252 ; Enable sound globally 161 ; Enable sound globally
253 ld a, $80 162 ld a, $80
254 ldh [rAUDENA], a 163 ldh [rAUDENA], a
255 ; Enable channel 1 in stereo 164 ; Enable channel 1 in stereo
256 ld a, $11 165 ld a, $FF
257 ldh [rAUDTERM], a 166 ldh [rAUDTERM], a
258 ; Set volume 167 ; Set volume
259 ld a, $77 168 ld a, $77
260 ldh [rAUDVOL], a 169 ldh [rAUDVOL], a
261 170
262 ;; enable the timer 171 ld c, 0 ;; Current order index
172 call _refresh_patterns
173
174 ;; Enable the timer
263 ld a, TACF_START | TACF_4KHZ 175 ld a, TACF_START | TACF_4KHZ
264 ld [rTAC], a 176 ld [rTAC], a
265 177
@@ -269,27 +181,41 @@ SECTION "main", ROM0[$0150]
269 181
270 jp _halt 182 jp _halt
271 183
272 _dosound: 184 _refresh_patterns:
273 ld a, [tick] 185 ;; Loads pattern registers with pointers to correct pattern based on
274 cp 6 186 ;; an order index
275 jp z, _continue
276 inc a
277 ld [tick], a
278 reti
279 _continue:
280 ld a, 0
281 ld [tick], a
282 187
283 ld a, [counter] 188 ;; Call with c set to what order to load
189 load_pattern: MACRO
190 ld hl, 0
191 ld l, c
192 ld de, \1
193 add hl, de
194
195 ld a, [hl+]
196 ld [\2], a
197 ld a, [hl+]
198 ld [\2+1], a
199 ENDM
200 load_pattern order1, pattern1
201 load_pattern order2, pattern2
202 load_pattern order3, pattern3
203 load_pattern order4, pattern4
204 ret
205
206 _lookup_note:
207 ;; Call with:
208 ;; Pattern pointer in DE
209
210 ;; Stores note value in H and L
211
212 ld a, [row]
284 213
285 ld h, 0 214 ld h, 0
286 ld l, a 215 ld l, a
287 ld de, sequence
288 add hl, de 216 add hl, de
289 ld a, [hl] 217 ld a, [hl]
290 218
291 ;; A now contains the note thing.. need to look it up in the table now
292
293 add a, a ;; double it to get index into hi/lo table 219 add a, a ;; double it to get index into hi/lo table
294 220
295 LD H, 0 221 LD H, 0
@@ -300,29 +226,152 @@ _continue:
300 INC HL 226 INC HL
301 LD H, [HL] 227 LD H, [HL]
302 LD L, A 228 LD L, A
229 ret
230
231 _playnote1:
232 ;; Call with:
233 ;; Note value in H and L
303 234
304 ; ld a, $1e 235 ;; Play a note on channel 1 (square wave)
305 ; ldh [rAUD1SWEEP], a 236
306 ld a, %10111111 ; $10 237 ld a, %11111111 ; $10
307 ldh [rAUD1LEN], a 238 ldh [rAUD1LEN], a
308 ld a, %11110000 239 ld a, %11110000
309 ldh [rAUD1ENV], a 240 ldh [rAUD1ENV], a
310 241
311 ld a, l 242 ld a, l
312 ldh [rAUD1LOW], a 243 ldh [rAUD1LOW], a
313 ; ld a, %10000000
314 ld a, h 244 ld a, h
315 or %10000000 245 or %10000000
316 ldh [rAUD1HIGH], a 246 ldh [rAUD1HIGH], a
247 ret
248
249 _playnote2:
250 ;; Call with:
251 ;; Note value in H and L
252
253 ;; Play a note on channel 2 (square wave)
254
255 ld a, %00111111 ; $10
256 ldh [rAUD2LEN], a
257 ld a, %11110000
258 ldh [rAUD2ENV], a
259
260 ld a, l
261 ldh [rAUD2LOW], a
262 ld a, h
263 or %10000000
264 ldh [rAUD2HIGH], a
265 ret
266
267 _playnote3:
268 ;; Call with:
269 ;; Note value in H and L
270
271 ;; Play a note on channel 3 (waveform)
272
273 ; ld a, %10111111 ; $10
274 ; ldh [rAUD1LEN], a
275 ; ld a, %11110000
276 ; ldh [rAUD1ENV], a
277
278 ; ld a, l
279 ; ldh [rAUD1LOW], a
280 ; ld a, h
281 ; or %10000000
282 ; ldh [rAUD1HIGH], a
283 ret
284
285 _playnote4:
286 ;; Call with:
287 ;; Note value in H and L
288
289 ;; Play a "note" on channel 4 (noise)
290
291 ; ld a, %10111111 ; $10
292 ; ldh [rAUD1LEN], a
293 ; ld a, %11110000
294 ; ldh [rAUD1ENV], a
295
296 ; ld a, l
297 ; ldh [rAUD1LOW], a
298 ; ld a, h
299 ; or %10000000
300 ; ldh [rAUD1HIGH], a
301 ret
302
303 loadShort: MACRO
304 ld a, [\1]
305 ld \3, a
306 ld a, [\1 + 1]
307 ld \2, a
308 ENDM
309
310 _dosound:
311 ld a, [tick]
312 ld c, a
313 cp 0
314 jp nz, _process_tick
315
316 ;; We're on tick zero, so lookup and play the notes,
317 ;; then continue as usual
318
319 loadShort pattern1, d, e
320 call _lookup_note
321 call _playnote1
322
323 loadShort pattern2, d, e
324 call _lookup_note
325 call _playnote2
326
327 ; loadShort pattern3, d, e
328 ; call _lookup_note
329 ; call _playnote
317 330
318 ld a, [counter] 331 ; loadShort pattern4, d, e
332 ; call _lookup_note
333 ; call _playnote
334
335 _process_tick:
336 ld a, c
319 inc a 337 inc a
320 338
321 cp 128 339 cp TICKS ;;TODO: Change to a parameter somewhere
322 jp c, skip 340 jp z, _newrow
341
342 ld [tick], a
343 reti
344
345 _newrow:
346 ;; Reset tick to 0
323 ld a, 0 347 ld a, 0
324 skip: 348 ld [tick], a
325 ld [counter], a 349
350 ;; Increment row.
351 ld a, [row]
352 inc a
353 cp PATTERN_LENGTH
354 jr nz, noreset
355 ;; Increment order and change loaded patterns
356 ld a, [order_cnt]
357 ld b, a
358 ld a, [current_order]
359 add a, 2
360 cp b
361 jp nz, update_current_order
362 ld a, 0
363 update_current_order:
364 ld [current_order], a
365 ld c, a
366
367 call _refresh_patterns
368
369 ld a, 0
370 ld [row], a
371 reti
372
373 noreset:
374 ld [row], a
326 375
327 reti 376 reti
328 377
Addedlunawaves.inc +65−0
@@ -0,0 +1,65 @@
1 ;; lunawaves at sunset
2 db A#5
3 db A#4
4 db F5
5 db A#5
6 db G#5
7 db A#4
8 db F5
9 db G#5
10 db G5
11 db A#4
12 db D#5
13 db G5
14 db G#5
15 db A#4
16 db F5
17 db G#5
18 db A#5
19 db A#4
20 db F5
21 db A#5
22 db G#5
23 db A#4
24 db F5
25 db G#5
26 db G5
27 db A#4
28 db D#5
29 db G5
30 db G#5
31 db A#4
32 db F5
33 db G#5
34 db A#5
35 db A#4
36 db F5
37 db A#5
38 db G#5
39 db A#4
40 db F5
41 db G#5
42 db G5
43 db A#4
44 db D#5
45 db G5
46 db G#5
47 db A#4
48 db F5
49 db G#5
50 db A#5
51 db A#4
52 db F5
53 db A#5
54 db G#5
55 db A#4
56 db F5
57 db G#5
58 db G5
59 db A#4
60 db D#5
61 db G5
62 db G#5
63 db A#4
64 db F5
65 db G#5
Addedunreal.inc +65−0
@@ -0,0 +1,65 @@
1 ;; unreal superhero
2 db F4
3 db G#4
4 db C5
5 db F5
6 db G#5
7 db F5
8 db C5
9 db G#4
10 db F4
11 db G#4
12 db C5
13 db F5
14 db G#5
15 db F5
16 db C5
17 db G#4
18 db F4
19 db C5
20 db D#5
21 db G#5
22 db C6
23 db G#5
24 db D#5
25 db C5
26 db G#4
27 db C5
28 db D#5
29 db G#5
30 db C6
31 db G#5
32 db D#5
33 db C5
34 db A#4
35 db D5
36 db F5
37 db A#5
38 db D6
39 db A#5
40 db F5
41 db D5
42 db A#4
43 db D5
44 db F5
45 db A#5
46 db D6
47 db A#5
48 db F5
49 db D5
50 db F4
51 db C5
52 db F5
53 db C6
54 db F6
55 db C6
56 db F5
57 db C5
58 db F4
59 db C5
60 db F5
61 db C6
62 db F6
63 db C6
64 db F5
65 db C5