Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Mockingboard Tone to/from Frequency Table

119 views
Skip to first unread message

Michael 'AppleWin Debugger Dev'

unread,
Apr 16, 2017, 7:34:13 AM4/16/17
to
Appendix E in the Mockingboard document at:

* ftp://ftp.apple.asimov.net/pub/apple_II/documentation/hardware/sound/Mockingboard%20Docs.pdf

has several incorrect values.
Most of these are minor mistakes except for F5 and G6 which are off more.

Course & Fine
Note Octave Frequency Decimal Hex. Notes

C 1 32.703 7 163 07 A3 <-- should be 7A2
C# 1 34.648 7 53 07 35 <-- should be 734
D# 1 38.891 6 108 06 6C <-- should be 66B
A# 1 58.270 4 73 04 49 <-- should be 448
D# 2 77.782 3 54 03 36 <-- should be 335
D# 3 155.564 1 155 01 9B <-- should be 19A
F 5 698.464 0 91 00 58 <-- Should be 5B
G 6 1567.968 0 40 00 2B <-- Should be 28

NOTE: The actual frequency is slightly off starting from C6 and higher.


Here are the correct frequencies and tones along with the relative error:

Note Frequency Tone reproduced Relative Error

A0 27.500 Hz -> $0914 ~ 27.504 Hz (0.016 %)
A0# 29.135 Hz -> $0891 ~ 29.147 Hz (0.042 %)
B0 30.868 Hz -> $0816 ~ 30.879 Hz (0.038 %)

C1 32.703 Hz -> $07A2 ~ 32.713 Hz (0.029 %)
C1# 34.648 Hz -> $0734 ~ 34.664 Hz (0.047 %)
D1 36.708 Hz -> $06CD ~ 36.715 Hz (0.018 %)
D1# 38.891 Hz -> $066B ~ 38.905 Hz (0.036 %)
E1 41.203 Hz -> $060F ~ 41.212 Hz (0.022 %)
F1 43.654 Hz -> $05B8 ~ 43.662 Hz (0.018 %)
F1# 46.249 Hz -> $0566 ~ 46.252 Hz (0.006 %)
G1 48.999 Hz -> $0518 ~ 49.019 Hz (0.039 %)
G1# 51.913 Hz -> $04CF ~ 51.926 Hz (0.024 %)
A1 55.000 Hz -> $048A ~ 55.009 Hz (0.016 %)
A1# 58.270 Hz -> $0448 ~ 58.322 Hz (0.088 %)
B1 61.735 Hz -> $040B ~ 61.759 Hz (0.038 %)

C2 65.406 Hz -> $03D1 ~ 65.425 Hz (0.029 %)
C2# 69.296 Hz -> $039A ~ 69.328 Hz (0.047 %)
D2 73.416 Hz -> $0366 ~ 73.472 Hz (0.076 %)
D2# 77.782 Hz -> $0335 ~ 77.857 Hz (0.097 %)
E2 82.407 Hz -> $0307 ~ 82.478 Hz (0.086 %)
F2 87.307 Hz -> $02DC ~ 87.323 Hz (0.018 %)
F2# 92.499 Hz -> $02B3 ~ 92.504 Hz (0.006 %)
G2 97.999 Hz -> $028C ~ 98.037 Hz (0.039 %)
G2# 103.826 Hz -> $0267 ~ 103.936 Hz (0.105 %)
A2 110.000 Hz -> $0245 ~ 110.018 Hz (0.016 %)
A2# 116.541 Hz -> $0224 ~ 116.643 Hz (0.088 %)
B2 123.471 Hz -> $0205 ~ 123.637 Hz (0.135 %)

C3 130.813 Hz -> $01E8 ~ 130.985 Hz (0.131 %)
C3# 138.591 Hz -> $01CD ~ 138.656 Hz (0.047 %)
D3 146.832 Hz -> $01B3 ~ 146.944 Hz (0.076 %)
D3# 155.563 Hz -> $019A ~ 155.904 Hz (0.219 %)
E3 164.814 Hz -> $0183 ~ 165.169 Hz (0.216 %)
F3 174.614 Hz -> $016E ~ 174.646 Hz (0.018 %)
F3# 184.997 Hz -> $0159 ~ 185.277 Hz (0.151 %)
G3 195.998 Hz -> $0146 ~ 196.075 Hz (0.039 %)
G3# 207.652 Hz -> $0133 ~ 208.210 Hz (0.269 %)
A3 220.000 Hz -> $0122 ~ 220.415 Hz (0.189 %)
A3# 233.082 Hz -> $0112 ~ 233.286 Hz (0.088 %)
B3 246.942 Hz -> $0102 ~ 247.754 Hz (0.329 %)

C4 261.626 Hz -> $00F4 ~ 261.969 Hz (0.131 %)
C4# 277.183 Hz -> $00E6 ~ 277.915 Hz (0.264 %)
D4 293.665 Hz -> $00D9 ~ 294.564 Hz (0.306 %)
D4# 311.127 Hz -> $00CD ~ 311.807 Hz (0.219 %)
E4 329.628 Hz -> $00C1 ~ 331.194 Hz (0.475 %)
F4 349.228 Hz -> $00B7 ~ 349.292 Hz (0.018 %)
F4# 369.994 Hz -> $00AC ~ 371.631 Hz (0.442 %)
G4 391.995 Hz -> $00A3 ~ 392.150 Hz (0.039 %)
G4# 415.305 Hz -> $0099 ~ 417.781 Hz (0.596 %)
A4 440.000 Hz -> $0091 ~ 440.831 Hz (0.189 %)
A4# 466.164 Hz -> $0089 ~ 466.573 Hz (0.088 %)
B4 493.883 Hz -> $0081 ~ 495.507 Hz (0.329 %)

C5 523.251 Hz -> $007A ~ 523.938 Hz (0.131 %)
C5# 554.365 Hz -> $0073 ~ 555.830 Hz (0.264 %)
D5 587.330 Hz -> $006C ~ 591.856 Hz (0.771 %)
D5# 622.254 Hz -> $0066 ~ 626.671 Hz (0.710 %)
E5 659.255 Hz -> $0060 ~ 665.838 Hz (0.999 %)
F5 698.456 Hz -> $005B ~ 702.422 Hz (0.568 %)
F5# 739.989 Hz -> $0056 ~ 743.261 Hz (0.442 %)
G5 783.991 Hz -> $0051 ~ 789.141 Hz (0.657 %)
G5# 830.609 Hz -> $004C ~ 841.059 Hz (1.258 %)
A5 880.000 Hz -> $0048 ~ 887.784 Hz (0.885 %)
A5# 932.328 Hz -> $0044 ~ 940.007 Hz (0.824 %)
B5 987.767 Hz -> $0040 ~ 998.757 Hz (1.113 %)

C6 1046.502 Hz -> $003D ~1047.876 Hz (0.131 %)
C6# 1108.731 Hz -> $0039 ~1121.411 Hz (1.144 %)
D6 1174.659 Hz -> $0036 ~1183.712 Hz (0.771 %)
D6# 1244.508 Hz -> $0033 ~1253.342 Hz (0.710 %)
E6 1318.510 Hz -> $0030 ~1331.676 Hz (0.999 %)
F6 1396.913 Hz -> $002D ~1420.454 Hz (1.685 %)
F6# 1479.978 Hz -> $002B ~1486.522 Hz (0.442 %)
G6 1567.982 Hz -> $0028 ~1598.011 Hz (1.915 %)
G6# 1661.219 Hz -> $0026 ~1682.117 Hz (1.258 %)
A6 1760.000 Hz -> $0024 ~1775.568 Hz (0.885 %)
A6# 1864.655 Hz -> $0022 ~1880.013 Hz (0.824 %)
B6 1975.533 Hz -> $0020 ~1997.514 Hz (1.113 %)

C7 2093.005 Hz -> $001E ~2130.682 Hz (1.800 %)
C7# 2217.461 Hz -> $001C ~2282.873 Hz (2.950 %)
D7 2349.318 Hz -> $001B ~2367.424 Hz (0.771 %)
D7# 2489.016 Hz -> $0019 ~2556.818 Hz (2.724 %)
E7 2637.020 Hz -> $0018 ~2663.352 Hz (0.999 %)
F7 2793.826 Hz -> $0016 ~2905.475 Hz (3.996 %)
F7# 2959.955 Hz -> $0015 ~3043.831 Hz (2.834 %)
G7 3135.963 Hz -> $0014 ~3196.022 Hz (1.915 %)
G7# 3322.438 Hz -> $0013 ~3364.234 Hz (1.258 %)
A7 3520.000 Hz -> $0012 ~3551.136 Hz (0.885 %)
A7# 3729.310 Hz -> $0011 ~3760.026 Hz (0.824 %)
B7 3951.066 Hz -> $0010 ~3995.028 Hz (1.113 %)

C8 4186.009 Hz -> $000F ~4261.363 Hz (1.800 %)
C8# 4434.922 Hz -> $000E ~4565.746 Hz (2.950 %)
D8 4698.636 Hz -> $000D ~4916.957 Hz (4.646 %)
D8# 4978.032 Hz -> $000C ~5326.704 Hz (7.004 %)
E8 5274.041 Hz -> $000C ~5326.704 Hz (0.999 %)
F8 5587.652 Hz -> $000B ~5810.950 Hz (3.996 %)
F8# 5919.911 Hz -> $000A ~6392.045 Hz (7.975 %)
G8 6271.927 Hz -> $000A ~6392.045 Hz (1.915 %)
G8# 6644.875 Hz -> $0009 ~7102.272 Hz (6.883 %)

I've included the full source to generate this table at:
https://github.com/Michaelangel007/apple2_mockingboard/blob/master/freq.c

Also ...

Here are the C functions to convert a frequency to/from the Mockingboard Tone Course and Tone Fine.

const double _1MHz_NTSC = 14318180.0 / 14.0; // 1,022,727 Hz

// Convert Frequency into Mockingboard Tone Period
// ========================================================================
int MockingboardGetTone( double freq_hz )
{
const int n = (int) (_1MHz_NTSC / freq_hz);
const int hi = n / 4096;
const int lo = (n - (hi * 4096)) / 16;

return (hi*256) + lo;
}

// Convert Mockingboard Tone Period into Frequency
// ========================================================================
double MockingboardGetFreq( int tone_period )
{
// / 256 = >> 8
// * 4096 = << 12
// int n = ((tone_period & 0xFF00) << 4) + ((tone_period & 0x00FF) << 4);
return _1MHz_NTSC / (double) (tone_period << 4);
}





Tom Porter

unread,
Apr 17, 2017, 12:30:56 AM4/17/17
to
300 REM 'OCATAVE 1
301 IF NA$ = "c" THEN NY = 7:NZ = 163
302 IF NA$ = "c#" THEN NY = 7:NZ = 53
303 IF NA$ = "d" THEN NY = 6:NZ = 205
304 IF NA$ = "d#" THEN NY = 6:NZ = 108
305 IF NA$ = "e" THEN NY = 6:NZ = 15
306 IF NA$ = "f" THEN NY = 5:NZ = 184
307 IF NA$ = "f#" THEN NY = 5:NZ = 102
308 IF NA$ = "g" THEN NY = 5:NZ = 24
309 IF NA$ = "g#" THEN NY = 4:NZ=207
310 IF NA$ = "a" THEN NY = 4:NZ = 138
311 IF NA$ = "a#" THEN NY = 4:NZ = 73
312 IF NA$ = "b" THEN NY = 4:NZ = 11
313 GOTO 370

315 REM 'OCATAVE 2
316 IF NA$ = "c" THEN NY = 3:NZ = 209
317 IF NA$ = "c#" THEN NY = 3:NZ = 154
318 IF NA$ = "d" THEN NY = 3:NZ = 102
319 IF NA$ = "d#" THEN NY = 3:NZ = 54
320 IF NA$ = "e" THEN NY = 3:NZ = 7
321 IF NA$ = "f" THEN NY = 2:NZ = 220
322 IF NA$ = "f#" THEN NY = 2:NZ = 179
323 IF NA$ = "g" THEN NY = 2:NZ = 140
324 IF NA$ = "g#" THEN NY = 2:NZ=103
325 IF NA$ = "a" THEN NY = 2:NZ = 69
326 IF NA$ = "a#" THEN NY = 2:NZ = 36
327 IF NA$ = "b" THEN NY = 2:NZ = 5
328 GOTO 370

330 REM 'OCATAVE 3
331 NY = 1
332 IF NA$ = "c" THEN NZ = 232
333 IF NA$ = "c#" THEN NZ = 205
334 IF NA$ = "d" THEN NZ = 179
335 IF NA$ = "d#" THEN NZ = 155
336 IF NA$ = "e" THEN NZ = 131
337 IF NA$ = "f" THEN NZ = 110
338 IF NA$ = "f#" THEN NZ = 89
339 IF NA$ = "g" THEN NZ = 70
340 IF NA$ = "g#" THEN NZ = 51
341 IF NA$ = "a" THEN NZ = 34
342 IF NA$ = "a#" THEN NZ = 18
343 IF NA$ = "b" THEN NZ = 2
344 GOTO 370

350 REM 'OCTAVE 4 AND ABOVE
351 NY = 0
352 IF NA$ = "c" THEN NZ = 244: REM 'OCATAVE 4
353 IF NA$ = "c#" THEN NZ = 230
354 IF NA$ = "d" THEN NZ = 217
355 IF NA$ = "d#" THEN NZ = 205
356 IF NA$ = "e" THEN NZ = 193
357 IF NA$ = "f" THEN NZ = 183
358 IF NA$ = "f#" THEN NZ = 172
359 IF NA$ = "g" THEN NZ = 163
360 IF NA$ = "g#" THEN NZ = 153
361 IF NA$ = "a" THEN NZ = 145
362 IF NA$ = "a#" THEN NZ = 137
363 IF NA$ = "b" THEN NZ = 129
368 NB = NB - 3
369 NZ = NZ / NB

Tom Porter

unread,
Apr 17, 2017, 12:33:33 AM4/17/17
to
There are errors in the manual?!?!... I better go back and recheck my MIDI2MOCK software lists... aka what I posted above... above Octave 4 it is a formula that divides OCTAVE into equal parts... interesting info... thanks!

Michael J. Mahon

unread,
Apr 17, 2017, 7:17:32 AM4/17/17
to
Unfortunately, the average clock frequency of the Apple II is not 1,022,727
Hz because of the insertion of a small delay after each horizontal line.

A closer approximation is 1.0205MHz, and the exact frequency can be found
in Sather's Understanding the Apple II (or Apple //e).

--
-michael - NadaNet 3.1 and AppleCrate II: http://michaeljmahon.com

Michael 'AppleWin Debugger Dev'

unread,
Apr 17, 2017, 12:48:55 PM4/17/17
to
Yeah, that 64th/65th cycle is annoying. Thanks for pointing out that I still needed to fix that.

Using the average Hz on Table 3.1, Page 3-5 of UtA2E:

1020484.32

Only notes A0 .. C5, and C6 are effected.
The notes C5# .. B5, and C6# ... G8# are not effected.

That Asimov Mockingboard document is _definitely_ out of "sync" now, pardon the pun. The lower the frequency the more out of tune it will be.

The final (NTSC) table is:

A0 27.500 Hz -> $090F ~ 27.503 Hz (0.012 %)
A0# 29.135 Hz -> $088D ~ 29.137 Hz (0.005 %)
B0 30.868 Hz -> $0812 ~ 30.871 Hz (0.012 %)

C1 32.703 Hz -> $079E ~ 32.708 Hz (0.014 %)
C1# 34.648 Hz -> $0730 ~ 34.663 Hz (0.044 %)
D1 36.708 Hz -> $06C9 ~ 36.719 Hz (0.029 %)
D1# 38.891 Hz -> $0667 ~ 38.914 Hz (0.060 %)
E1 41.203 Hz -> $060B ~ 41.228 Hz (0.060 %)
F1 43.654 Hz -> $05B5 ~ 43.655 Hz (0.004 %)
F1# 46.249 Hz -> $0563 ~ 46.251 Hz (0.004 %)
G1 48.999 Hz -> $0515 ~ 49.024 Hz (0.050 %)
G1# 51.913 Hz -> $04CC ~ 51.938 Hz (0.049 %)
A1 55.000 Hz -> $0487 ~ 55.030 Hz (0.055 %)
A1# 58.270 Hz -> $0446 ~ 58.300 Hz (0.051 %)
B1 61.735 Hz -> $0409 ~ 61.743 Hz (0.012 %)

C2 65.406 Hz -> $03CF ~ 65.416 Hz (0.014 %)
C2# 69.296 Hz -> $0398 ~ 69.326 Hz (0.044 %)
D2 73.416 Hz -> $0364 ~ 73.480 Hz (0.086 %)
D2# 77.782 Hz -> $0333 ~ 77.876 Hz (0.121 %)
E2 82.407 Hz -> $0305 ~ 82.510 Hz (0.125 %)
F2 87.307 Hz -> $02DA ~ 87.370 Hz (0.072 %)
F2# 92.499 Hz -> $02B1 ~ 92.569 Hz (0.076 %)
G2 97.999 Hz -> $028A ~ 98.123 Hz (0.127 %)
G2# 103.826 Hz -> $0266 ~ 103.877 Hz (0.049 %)
A2 110.000 Hz -> $0243 ~ 110.156 Hz (0.142 %)
A2# 116.541 Hz -> $0223 ~ 116.600 Hz (0.051 %)
B2 123.471 Hz -> $0204 ~ 123.605 Hz (0.109 %)

C3 130.813 Hz -> $01E7 ~ 130.966 Hz (0.117 %)
C3# 138.591 Hz -> $01CC ~ 138.653 Hz (0.044 %)
D3 146.832 Hz -> $01B2 ~ 146.959 Hz (0.086 %)
D3# 155.563 Hz -> $0199 ~ 155.942 Hz (0.243 %)
E3 164.814 Hz -> $0182 ~ 165.234 Hz (0.255 %)
F3 174.614 Hz -> $016D ~ 174.740 Hz (0.072 %)
F3# 184.997 Hz -> $0158 ~ 185.408 Hz (0.222 %)
G3 195.998 Hz -> $0145 ~ 196.247 Hz (0.127 %)
G3# 207.652 Hz -> $0133 ~ 207.753 Hz (0.049 %)
A3 220.000 Hz -> $0121 ~ 220.693 Hz (0.315 %)
A3# 233.082 Hz -> $0111 ~ 233.627 Hz (0.234 %)
B3 246.942 Hz -> $0102 ~ 247.210 Hz (0.109 %)

C4 261.626 Hz -> $00F3 ~ 262.470 Hz (0.323 %)
C4# 277.183 Hz -> $00E6 ~ 277.306 Hz (0.044 %)
D4 293.665 Hz -> $00D9 ~ 293.918 Hz (0.086 %)
D4# 311.127 Hz -> $00CC ~ 312.648 Hz (0.489 %)
E4 329.628 Hz -> $00C1 ~ 330.468 Hz (0.255 %)
F4 349.228 Hz -> $00B6 ~ 350.441 Hz (0.347 %)
F4# 369.994 Hz -> $00AC ~ 370.816 Hz (0.222 %)
G4 391.995 Hz -> $00A2 ~ 393.705 Hz (0.436 %)
G4# 415.305 Hz -> $0099 ~ 416.865 Hz (0.376 %)
A4 440.000 Hz -> $0090 ~ 442.919 Hz (0.663 %)
A4# 466.164 Hz -> $0088 ~ 468.973 Hz (0.603 %)
B4 493.883 Hz -> $0081 ~ 494.421 Hz (0.109 %)

C5 523.251 Hz -> $0079 ~ 527.110 Hz (0.737 %)
C5# 554.365 Hz -> $0073 ~ 554.611 Hz (0.044 %)
D5 587.330 Hz -> $006C ~ 590.558 Hz (0.550 %)
D5# 622.254 Hz -> $0066 ~ 625.297 Hz (0.489 %)
E5 659.255 Hz -> $0060 ~ 664.378 Hz (0.777 %)
F5 698.456 Hz -> $005B ~ 700.882 Hz (0.347 %)
F5# 739.989 Hz -> $0056 ~ 741.631 Hz (0.222 %)
G5 783.991 Hz -> $0051 ~ 787.411 Hz (0.436 %)
G5# 830.609 Hz -> $004C ~ 839.214 Hz (1.036 %)
A5 880.000 Hz -> $0048 ~ 885.837 Hz (0.663 %)
A5# 932.328 Hz -> $0044 ~ 937.945 Hz (0.603 %)
B5 987.767 Hz -> $0040 ~ 996.567 Hz (0.891 %)

C6 1046.502 Hz -> $003C ~1063.005 Hz (1.577 %)
C6# 1108.731 Hz -> $0039 ~1118.952 Hz (0.922 %)
D6 1174.659 Hz -> $0036 ~1181.116 Hz (0.550 %)
D6# 1244.508 Hz -> $0033 ~1250.594 Hz (0.489 %)
E6 1318.510 Hz -> $0030 ~1328.756 Hz (0.777 %)
F6 1396.913 Hz -> $002D ~1417.339 Hz (1.462 %)
F6# 1479.978 Hz -> $002B ~1483.262 Hz (0.222 %)
G6 1567.982 Hz -> $0028 ~1594.507 Hz (1.692 %)
G6# 1661.219 Hz -> $0026 ~1678.428 Hz (1.036 %)
A6 1760.000 Hz -> $0024 ~1771.674 Hz (0.663 %)
A6# 1864.655 Hz -> $0022 ~1875.890 Hz (0.603 %)
B6 1975.533 Hz -> $0020 ~1993.133 Hz (0.891 %)

C7 2093.005 Hz -> $001E ~2126.009 Hz (1.577 %)
C7# 2217.461 Hz -> $001C ~2277.867 Hz (2.724 %)
D7 2349.318 Hz -> $001B ~2362.232 Hz (0.550 %)
D7# 2489.016 Hz -> $0019 ~2551.211 Hz (2.499 %)
E7 2637.020 Hz -> $0018 ~2657.511 Hz (0.777 %)
F7 2793.826 Hz -> $0016 ~2899.103 Hz (3.768 %)
F7# 2959.955 Hz -> $0015 ~3037.156 Hz (2.608 %)
G7 3135.963 Hz -> $0014 ~3189.014 Hz (1.692 %)
G7# 3322.438 Hz -> $0013 ~3356.856 Hz (1.036 %)
A7 3520.000 Hz -> $0012 ~3543.348 Hz (0.663 %)
A7# 3729.310 Hz -> $0011 ~3751.781 Hz (0.603 %)
B7 3951.066 Hz -> $0010 ~3986.267 Hz (0.891 %)

C8 4186.009 Hz -> $000F ~4252.018 Hz (1.577 %)
C8# 4434.922 Hz -> $000E ~4555.734 Hz (2.724 %)
D8 4698.636 Hz -> $000D ~4906.175 Hz (4.417 %)
D8# 4978.032 Hz -> $000C ~5315.023 Hz (6.770 %)
E8 5274.041 Hz -> $000C ~5315.023 Hz (0.777 %)
F8 5587.652 Hz -> $000B ~5798.206 Hz (3.768 %)
F8# 5919.911 Hz -> $000A ~6378.027 Hz (7.739 %)
G8 6271.927 Hz -> $000A ~6378.027 Hz (1.692 %)
G8# 6644.875 Hz -> $0009 ~7086.697 Hz (6.649 %)

All GitHub sources updated (Readme.md, Freq.c)

Thanks Michael!

Michael 'AppleWin Debugger Dev'

unread,
Apr 17, 2017, 1:53:48 PM4/17/17
to
Tom,

Yes, those frequencies are off. Using the average 1020484.32 Hz, as Michael Mahon points out, the changes should be:

300 REM 'OCATAVE 1
301 IF NA$ = "c" THEN NY = 7:NZ = 158:REM FIXED
302 IF NA$ = "c#" THEN NY = 7:NZ = 48:REM FIXED
303 IF NA$ = "d" THEN NY = 6:NZ = 201:REM FIXED
304 IF NA$ = "d#" THEN NY = 6:NZ = 103:REM FIXED
305 IF NA$ = "e" THEN NY = 6:NZ = 11:REM FIXED
306 IF NA$ = "f" THEN NY = 5:NZ = 181:REM FIXED
307 IF NA$ = "f#" THEN NY = 5:NZ = 99:REM FIXED
308 IF NA$ = "g" THEN NY = 5:NZ = 21:REM FIXED
309 IF NA$ = "g#" THEN NY = 4:NZ = 204:REM FIXED
310 IF NA$ = "a" THEN NY = 4:NZ = 135:REM FIXED
311 IF NA$ = "a#" THEN NY = 4:NZ = 70:REM FIXED
312 IF NA$ = "b" THEN NY = 4:NZ = 9:REM FIXED
313 GOTO 370

315 REM 'OCATAVE 2
316 IF NA$ = "c" THEN NY = 3:NZ = 207:REM FIXED
317 IF NA$ = "c#" THEN NY = 3:NZ = 152:REM FIXED
318 IF NA$ = "d" THEN NY = 3:NZ = 100:REM FIXED
319 IF NA$ = "d#" THEN NY = 3:NZ = 51:REM FIXED
320 IF NA$ = "e" THEN NY = 3:NZ = 5:REM FIXED
321 IF NA$ = "f" THEN NY = 2:NZ = 218:REM FIXED
322 IF NA$ = "f#" THEN NY = 2:NZ = 177:REM FIXED
323 IF NA$ = "g" THEN NY = 2:NZ = 138:REM FIXED
324 IF NA$ = "g#" THEN NY = 2:NZ = 102:REM FIXED
325 IF NA$ = "a" THEN NY = 2:NZ = 67:REM FIXED
326 IF NA$ = "a#" THEN NY = 2:NZ = 35:REM FIXED
327 IF NA$ = "b" THEN NY = 2:NZ = 4:REM FIXED
328 GOTO 370

330 REM 'OCATAVE 3
331 NY = 1
332 IF NA$ = "c" THEN NZ = 231:REM FIXED
333 IF NA$ = "c#" THEN NZ = 204:REM FIXED
334 IF NA$ = "d" THEN NZ = 178:REM FIXED
335 IF NA$ = "d#" THEN NZ = 153:REM FIXED
336 IF NA$ = "e" THEN NZ = 130:REM FIXED
337 IF NA$ = "f" THEN NZ = 109:REM FIXED
338 IF NA$ = "f#" THEN NZ = 88:REM FIXED
339 IF NA$ = "g" THEN NZ = 69:REM FIXED
340 IF NA$ = "g#" THEN NZ = 51
341 IF NA$ = "a" THEN NZ = 33:REM FIXED
342 IF NA$ = "a#" THEN NZ = 17:REM FIXED
343 IF NA$ = "b" THEN NZ = 2
344 GOTO 370

350 REM 'OCTAVE 4 AND ABOVE
351 NY = 0
352 IF NA$ = "c" THEN NZ = 243:REM 'OCATAVE 4 FIXED
353 IF NA$ = "c#" THEN NZ = 230
354 IF NA$ = "d" THEN NZ = 217
355 IF NA$ = "d#" THEN NZ = 204:REM FIXED
356 IF NA$ = "e" THEN NZ = 193
357 IF NA$ = "f" THEN NZ = 182:REM FIXED
358 IF NA$ = "f#" THEN NZ = 172
359 IF NA$ = "g" THEN NZ = 162:REM FIXED
360 IF NA$ = "g#" THEN NZ = 153
361 IF NA$ = "a" THEN NZ = 144:REM FIXED
362 IF NA$ = "a#" THEN NZ = 136:REM FIXED
363 IF NA$ = "b" THEN NZ = 129
368 NB = NB - 3
369 NZ = INT(NZ / NB)

Worse, is that NB=NB-3, and NZ=NZ/NB calculation is incorrect.
It has two problems:

a) The first problem is that it generates non-integer values.
It is trivial to fix with an INT() wrapper.

b) It generates bogus Octave 6, 7, and 8 values.
i.e. It calculates C6 as 81 -- the correct value is 60.

Here is a mapping to get it to calculate the actual octave frequencies.

Calculate Actual
Octave 7 Octave 6
Octave 11 Octave 7
Octave 19 Octave 8


You can use this test program to see how badly it performs:

10 DIM N$(12)
20 FOR I=1 TO 12:READ N$(I):NEXT
30 FOR O=4 TO 19
35 PRINT "Octave ";O
40 FOR I=1 TO 12
50 NB=O:NA$=N$(I):GOSUB 350
60 NEXT
70 PRINT "...";:GET A$
80 NEXT
90 END
370 ? " ";NA$;" ";NY;" ";NZ
380 RETURN
999 DATA c,c#,d,d#,e,f,f#,g,g#,a,a#,b


Here are the corrected values for Octaves 6, 7, and 8

9600 REM 'OCTAVE 6 AND ABOVE
9601 NY = 0
9602 IF NA$ = "c" THEN NZ = 60
9603 IF NA$ = "c#" THEN NZ = 57
9604 IF NA$ = "d" THEN NZ = 54
9605 IF NA$ = "d#" THEN NZ = 51
9606 IF NA$ = "e" THEN NZ = 48
9607 IF NA$ = "f" THEN NZ = 45
9608 IF NA$ = "f#" THEN NZ = 43
9609 IF NA$ = "g" THEN NZ = 40
9610 IF NA$ = "g#" THEN NZ = 38
9611 IF NA$ = "a" THEN NZ = 36
9612 IF NA$ = "a#" THEN NZ = 34
9613 IF NA$ = "b" THEN NZ = 32

9700 REM 'OCTAVE 7 AND ABOVE
9701 NY = 0
9702 IF NA$ = "c" THEN NZ = 30
9703 IF NA$ = "c#" THEN NZ = 28
9704 IF NA$ = "d" THEN NZ = 27
9705 IF NA$ = "d#" THEN NZ = 25
9706 IF NA$ = "e" THEN NZ = 24
9707 IF NA$ = "f" THEN NZ = 22
9708 IF NA$ = "f#" THEN NZ = 21
9709 IF NA$ = "g" THEN NZ = 20
9710 IF NA$ = "g#" THEN NZ = 19
9711 IF NA$ = "a" THEN NZ = 18
9712 IF NA$ = "a#" THEN NZ = 17
9713 IF NA$ = "b" THEN NZ = 16

9800 REM 'OCTAVE 8 AND ABOVE
9801 NY = 0
9802 IF NA$ = "c" THEN NZ = 15
9803 IF NA$ = "c#" THEN NZ = 14
9804 IF NA$ = "d" THEN NZ = 13
9805 IF NA$ = "d#" THEN NZ = 12
9806 IF NA$ = "e" THEN NZ = 12
9807 IF NA$ = "f" THEN NZ = 11
9808 IF NA$ = "f#" THEN NZ = 10
9809 IF NA$ = "g" THEN NZ = 10
9810 IF NA$ = "g#" THEN NZ = 9
9811 IF NA$ = "a" THEN NZ = 9
9812 IF NA$ = "a#" THEN NZ = 8
9813 IF NA$ = "b" THEN NZ = 8

Cheers
Michael

Michael 'AppleWin Debugger Dev'

unread,
Apr 17, 2017, 2:42:48 PM4/17/17
to
We can actually do a little better for tuning if we minimize the absolute error in the reconstructed (reproduced) frequency:

Note Frequency Tone Decimal reproduced Relative Error

A0 27.500 Hz -> $090F ( 9 15) ~ 27.503 Hz (+0.012%)
A0# 29.135 Hz -> $088D ( 8 141) ~ 29.137 Hz (+0.005%)
B0 30.868 Hz -> $0812 ( 8 18) ~ 30.871 Hz (+0.012%)

C1 32.703 Hz -> $079E ( 7 158) ~ 32.708 Hz (+0.014%)
C1# 34.648 Hz -> $0731 ( 7 49) ~ 34.644 Hz (-0.010%)
D1 36.708 Hz -> $06C9 ( 6 201) ~ 36.719 Hz (+0.029%)
D1# 38.891 Hz -> $0668 ( 6 104) ~ 38.890 Hz (-0.001%)
E1 41.203 Hz -> $060C ( 6 12) ~ 41.202 Hz (-0.004%)
F1 43.654 Hz -> $05B5 ( 5 181) ~ 43.655 Hz (+0.004%)
F1# 46.249 Hz -> $0563 ( 5 99) ~ 46.251 Hz (+0.004%)
G1 48.999 Hz -> $0516 ( 5 22) ~ 48.986 Hz (-0.027%)
G1# 51.913 Hz -> $04CD ( 4 205) ~ 51.896 Hz (-0.033%)
A1 55.000 Hz -> $0488 ( 4 136) ~ 54.983 Hz (-0.031%)
A1# 58.270 Hz -> $0447 ( 4 71) ~ 58.247 Hz (-0.041%)
B1 61.735 Hz -> $0409 ( 4 9) ~ 61.743 Hz (+0.012%)

C2 65.406 Hz -> $03CF ( 3 207) ~ 65.416 Hz (+0.014%)
C2# 69.296 Hz -> $0398 ( 3 152) ~ 69.326 Hz (+0.044%)
D2 73.416 Hz -> $0365 ( 3 101) ~ 73.395 Hz (-0.029%)
D2# 77.782 Hz -> $0334 ( 3 52) ~ 77.781 Hz (-0.001%)
E2 82.407 Hz -> $0306 ( 3 6) ~ 82.403 Hz (-0.004%)
F2 87.307 Hz -> $02DB ( 2 219) ~ 87.251 Hz (-0.065%)
F2# 92.499 Hz -> $02B2 ( 2 178) ~ 92.435 Hz (-0.069%)
G2 97.999 Hz -> $028B ( 2 139) ~ 97.973 Hz (-0.027%)
G2# 103.826 Hz -> $0266 ( 2 102) ~ 103.877 Hz (+0.049%)
A2 110.000 Hz -> $0244 ( 2 68) ~ 109.966 Hz (-0.031%)
A2# 116.541 Hz -> $0223 ( 2 35) ~ 116.600 Hz (+0.051%)
B2 123.471 Hz -> $0205 ( 2 5) ~ 123.366 Hz (-0.085%)

C3 130.813 Hz -> $01E8 ( 1 232) ~ 130.697 Hz (-0.088%)
C3# 138.591 Hz -> $01CC ( 1 204) ~ 138.653 Hz (+0.044%)
D3 146.832 Hz -> $01B2 ( 1 178) ~ 146.959 Hz (+0.086%)
D3# 155.563 Hz -> $019A ( 1 154) ~ 155.562 Hz (-0.001%)
E3 164.814 Hz -> $0183 ( 1 131) ~ 164.807 Hz (-0.004%)
F3 174.614 Hz -> $016D ( 1 109) ~ 174.740 Hz (+0.072%)
F3# 184.997 Hz -> $0159 ( 1 89) ~ 184.870 Hz (-0.069%)
G3 195.998 Hz -> $0145 ( 1 69) ~ 196.247 Hz (+0.127%)
G3# 207.652 Hz -> $0133 ( 1 51) ~ 207.753 Hz (+0.049%)
A3 220.000 Hz -> $0122 ( 1 34) ~ 219.932 Hz (-0.031%)
A3# 233.082 Hz -> $0112 ( 1 18) ~ 232.775 Hz (-0.132%)
B3 246.942 Hz -> $0102 ( 1 2) ~ 247.210 Hz (+0.109%)

C4 261.626 Hz -> $00F4 ( 0 244) ~ 261.395 Hz (-0.088%)
C4# 277.183 Hz -> $00E6 ( 0 230) ~ 277.306 Hz (+0.044%)
D4 293.665 Hz -> $00D9 ( 0 217) ~ 293.918 Hz (+0.086%)
D4# 311.127 Hz -> $00CD ( 0 205) ~ 311.123 Hz (-0.001%)
E4 329.628 Hz -> $00C1 ( 0 193) ~ 330.468 Hz (+0.255%)
F4 349.228 Hz -> $00B7 ( 0 183) ~ 348.526 Hz (-0.201%)
F4# 369.994 Hz -> $00AC ( 0 172) ~ 370.816 Hz (+0.222%)
G4 391.995 Hz -> $00A3 ( 0 163) ~ 391.290 Hz (-0.180%)
G4# 415.305 Hz -> $009A ( 0 154) ~ 414.158 Hz (-0.276%)
A4 440.000 Hz -> $0091 ( 0 145) ~ 439.864 Hz (-0.031%)
A4# 466.164 Hz -> $0089 ( 0 137) ~ 465.549 Hz (-0.132%)
B4 493.883 Hz -> $0081 ( 0 129) ~ 494.421 Hz (+0.109%)

C5 523.251 Hz -> $007A ( 0 122) ~ 522.789 Hz (-0.088%)
C5# 554.365 Hz -> $0073 ( 0 115) ~ 554.611 Hz (+0.044%)
D5 587.330 Hz -> $006D ( 0 109) ~ 585.140 Hz (-0.373%)
D5# 622.254 Hz -> $0067 ( 0 103) ~ 619.226 Hz (-0.487%)
E5 659.255 Hz -> $0061 ( 0 97) ~ 657.529 Hz (-0.262%)
F5 698.456 Hz -> $005B ( 0 91) ~ 700.882 Hz (+0.347%)
F5# 739.989 Hz -> $0056 ( 0 86) ~ 741.631 Hz (+0.222%)
G5 783.991 Hz -> $0051 ( 0 81) ~ 787.411 Hz (+0.436%)
G5# 830.609 Hz -> $004D ( 0 77) ~ 828.315 Hz (-0.276%)
A5 880.000 Hz -> $0048 ( 0 72) ~ 885.837 Hz (+0.663%)
A5# 932.328 Hz -> $0044 ( 0 68) ~ 937.945 Hz (+0.603%)
B5 987.767 Hz -> $0041 ( 0 65) ~ 981.235 Hz (-0.661%)

C6 1046.502 Hz -> $003D ( 0 61) ~1045.578 Hz (-0.088%)
C6# 1108.731 Hz -> $003A ( 0 58) ~1099.660 Hz (-0.818%)
D6 1174.659 Hz -> $0036 ( 0 54) ~1181.116 Hz (+0.550%)
D6# 1244.508 Hz -> $0033 ( 0 51) ~1250.594 Hz (+0.489%)
E6 1318.510 Hz -> $0030 ( 0 48) ~1328.756 Hz (+0.777%)
F6 1396.913 Hz -> $002E ( 0 46) ~1386.528 Hz (-0.743%)
F6# 1479.978 Hz -> $002B ( 0 43) ~1483.262 Hz (+0.222%)
G6 1567.982 Hz -> $0029 ( 0 41) ~1555.616 Hz (-0.789%)
G6# 1661.219 Hz -> $0026 ( 0 38) ~1678.428 Hz (+1.036%)
A6 1760.000 Hz -> $0024 ( 0 36) ~1771.674 Hz (+0.663%)
A6# 1864.655 Hz -> $0022 ( 0 34) ~1875.890 Hz (+0.603%)
B6 1975.533 Hz -> $0020 ( 0 32) ~1993.133 Hz (+0.891%)

C7 2093.005 Hz -> $001E ( 0 30) ~2126.009 Hz (+1.577%)
C7# 2217.461 Hz -> $001D ( 0 29) ~2199.320 Hz (-0.818%)
D7 2349.318 Hz -> $001B ( 0 27) ~2362.232 Hz (+0.550%)
D7# 2489.016 Hz -> $001A ( 0 26) ~2453.087 Hz (-1.443%)
E7 2637.020 Hz -> $0018 ( 0 24) ~2657.511 Hz (+0.777%)
F7 2793.826 Hz -> $0017 ( 0 23) ~2773.055 Hz (-0.743%)
F7# 2959.955 Hz -> $0016 ( 0 22) ~2899.103 Hz (-2.056%)
G7 3135.963 Hz -> $0014 ( 0 20) ~3189.014 Hz (+1.692%)
G7# 3322.438 Hz -> $0013 ( 0 19) ~3356.856 Hz (+1.036%)
A7 3520.000 Hz -> $0012 ( 0 18) ~3543.348 Hz (+0.663%)
A7# 3729.310 Hz -> $0011 ( 0 17) ~3751.781 Hz (+0.603%)
B7 3951.066 Hz -> $0010 ( 0 16) ~3986.267 Hz (+0.891%)

C8 4186.009 Hz -> $000F ( 0 15) ~4252.018 Hz (+1.577%)
C8# 4434.922 Hz -> $000E ( 0 14) ~4555.734 Hz (+2.724%)
D8 4698.636 Hz -> $000E ( 0 14) ~4555.734 Hz (-3.041%)
D8# 4978.032 Hz -> $000D ( 0 13) ~4906.175 Hz (-1.443%)
E8 5274.041 Hz -> $000C ( 0 12) ~5315.023 Hz (+0.777%)
F8 5587.652 Hz -> $000B ( 0 11) ~5798.206 Hz (+3.768%)
F8# 5919.911 Hz -> $000B ( 0 11) ~5798.206 Hz (-2.056%)
G8 6271.927 Hz -> $000A ( 0 10) ~6378.027 Hz (+1.692%)
G8# 6644.875 Hz -> $000A ( 0 10) ~6378.027 Hz (-4.016%)

Bill Buckels

unread,
Apr 17, 2017, 3:25:00 PM4/17/17
to
"Michael 'AppleWin Debugger Dev'" <michael....@gmail.com> wrote:
>300 REM 'OCATAVE 1

Should be "OCTAVE" not "OCATAVE"...

Bill


Michael 'AppleWin Debugger Dev'

unread,
Apr 17, 2017, 4:03:54 PM4/17/17
to
On Monday, April 17, 2017 at 8:25:00 AM UTC-7, Bill Buckels wrote:
> "Michael 'AppleWin Debugger Dev'" wrote:
> >300 REM 'OCATAVE 1
> Should be "OCTAVE" not "OCATAVE"...

Thanks Bill.

I never noticed Tom spelt it wrong -- I was too busy getting the frequencies correct. ;-)

Michael 'AppleWin Debugger Dev'

unread,
Apr 17, 2017, 4:21:27 PM4/17/17
to
Tom,

Make sure you see my other post "We can actually do a little better for tuning if we minimize the absolute error in the reconstructed (reproduced) frequency:"

I've also included the corresponding decimal values in the table as a convenience since it was trivial to add.

Tom Porter

unread,
Apr 19, 2017, 11:55:18 PM4/19/17
to
I see all the work you did comparing numbers to my tables... I had no idea it was off so far... I noted your changes and working on the code now... by tomorrow MIDI2MOCK will be upgraded to 1.15 with the changes... I appreciate you looking at it (Glad I posted the conversion code... a big whoops!) -Tom

Tom Porter

unread,
Apr 19, 2017, 11:57:14 PM4/19/17
to
Now all we gotta do is make it IRQ driven, and add voices! But all the sudden I see all sorts of mockingboard activity, so there's lots of competition. I have a habit of working on several projects at once... and that tends to slow down dev time.

Michael 'AppleWin Debugger Dev'

unread,
Apr 20, 2017, 1:21:17 AM4/20/17
to
> Now all we gotta do is make it IRQ driven, and add voices!

I hear ya!

I would -love- to have some IRQ sample code. ANYTHING to get started would be much appreciated. NOTE: I have _not_ yet started looking for whats on Asimov or in c.s.a2.programming -- but should "soonish".

I probably won't have any time to figure out all the different envelope parameters to add "voices" for quite some time (months to years due to other projects) -- but I definitely would like to circle back in this again at some point in the future.

Michael J. Mahon

unread,
Apr 20, 2017, 3:07:04 PM4/20/17
to
Michael 'AppleWin Debugger Dev' <michael....@gmail.com> wrote:
Take a look at the player program in Music Construction Set. It's
interrupt-driven and plays MCS music, which is quite general.

I don't recall whether it plays "percussion", but that shouldn't be
difficult to add.

Michael 'AppleWin Debugger Dev'

unread,
Apr 20, 2017, 3:32:11 PM4/20/17
to
On Thursday, April 20, 2017 at 8:07:04 AM UTC-7, Michael J. Mahon wrote:
> Michael 'AppleWin Debugger Dev' wrote:
> Take a look at the player program in Music Construction Set. It's
> interrupt-driven and plays MCS music, which is quite general.

Awesome, thanks for the info!

> I don't recall whether it plays "percussion", but that shouldn't be
> difficult to add.

Yeah, that's just a matter of figuring out / setting the correct noise params.
i.e.

D - SOUND UTILITY
(L) Load: Gunshot
Tone Course: 0
Tone Course: 0
Noise Period: 63
Amplitude: 16
Disable: 7
Envelope Fine: 0
Envelope Course: 10
Envelop Shape: 0

Which I tweaked for a Closed Hi-Hat: :-)

Tone Course: 0
Tone Course: 1
Noise Period: 1
Disable: 6 for quiet, 7 for loud
Amplitude: 16
Envelope Course: 0
Envelope Fine: 10
Envelope Func: 9


The first order of business will be to write this dog-slow Applesoft program into assembly so the turn-around time for changing params is much faster.

Looks like I have another project. :-)
0 new messages