10
20
30 :
40 VDU 26,12
50 base=430.54:
60 base=440.00:
70 FOR midi_block%=0 TO 72 STEP 72
80 IF midi_block%=0 :PRINT"OCTAVE:";:FOR A%=-5 TO -1:PRINT SPC4;A%;SPC11;:NEXT:PRINT " MIDDLE"
90 IF midi_block%=72:PRINT"OCTAVE:";:FOR A%=1 TO 5:PRINT SPC4;"+";A%;SPC11;:NEXT:PRINT
100 PRINT "NOTE|MIDI SOUND FREQ |MIDI SOUND FREQ |MIDI SOUND FREQ |MIDI SOUND FREQ |MIDI SOUND FREQ |MIDI SOUND FREQ |NOTE"
110 FOR midi_row%=0 TO 11
120 PRINT " ";MID$("C C#D D#E F F#G G#A A#B ",midi_row%*2+1,2);" |";
130 FOR note%=midi_block%+midi_row% TO midi_block%+midi_row%+71 STEP 12
140 PROCdisplay(note%)
150 NEXT note%
160 PRINT " ";MID$("C C#D D#E F F#G G#A A#B ",midi_row%*2+1,2)
170 NEXT midi_row%:PRINT
180 NEXT midi_block%
190 END
200 DEF PROCdisplay(midi%)
210 IF midi%>127:PRINTSPC16;"|";:ENDPROC
220 sound% =midi%*4-140
230 octave%=(midi%+3)DIV12
240 tone% =(midi%+3)MOD12
250 freq =base*2^(octave%-6)
260 offset =(2^(1/12))^tone%
270 freq =freq*offset
280 PRINT FNd(midi%,3);
290 IF sound%<0 OR sound%>255:PRINT SPC6; ELSE PRINT FNd(sound%,6);
300 PRINT FNd(freq,5);"Hz|";
310 ENDPROC
320 DEF FNd(A%,N%)=RIGHT$(" "+STR$ A%,N%)
330 :
340
350 freq=55
360 sound=-8
370 REPEAT
380 PRINT sound;TAB(12);freq;"Hz";TAB(24);" -> ";FNbbc_freq_to_pitch(freq)
390 sound=sound+4
400 freq=freq*(2^(1/12))
410 UNTIL sound>255
420 END
430 :
440 DEFFNbbc_freq_to_pitch(freq)
450 LOCAL base:base=440:
460 =INT((LN(freq/base)/LN2)*48+136)