10 REM > NoteList
   20 REM International A = 440Hz = MIDI 69 = SOUND 136
   30 :
   40 VDU 26,12
   50 base=430.54:REM Scientific C = 256Hz
   60 base=440.00:REM International A
   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 REM The other way around:
  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:REM International A
  460 =INT((LN(freq/base)/LN2)*48+136)