ArSid - Arduino Sid Synthesizer

Mon 22-Jul-19
03:50:16




Noten Generator

Datum: Tue 02 January 2018
Samenvatting: Programma om van de Noten-tabel de tussenliggende PitchBend noten te berekenen.
 Soort Artikel: Software
Status: Afgerond



[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]
notengen_1.jpg
1/2: notengen_1.jpg.
notengen_2.jpg
2/2: notengen_2.jpg.
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]

In de Datasheet van de 6581 staat een tabel welke waardes er in de Oscillatoren gestopt moet worden om een bepaalde muzieknoot te kunnen laten klinken. Maar een elektronisch muziek instrument moet in staat zijn om een PitchBend wiel correct te kunnen interpreteren. Er moeten dus tussen liggende waardes gegenereerd kunnen worden, zonder dat dit te veel tijd gaat kosten.

Probleem is echter dat de muziek-frequenties logaritmisch van elkaar af liggen. Dit betekent dat er geen vast getal zit tussen de muzieknoten, maar dat er tussen de noten een vermenigvuldigingsfactor is waarmee de volgende kan worden berekend. Bij komend probleem is dat deze factor geen mooi getal is, maar rond de waarde 1.05 ligt.

Bekend is dat een oktaaf twee keer zo hoog (of de helft keer zo laag) klinkt als de vorige oktaaf. Ook is bekend dat er 12 halve noten in een oktaaf gaan. Met deze twee getallen is de factor te berekenen.

Deze factor is de 12de machts wortel uit 2, of rekenkundig 2^(1/12), of te wel 1.05946309435 (op 11 decimalen). De Arduino is echter maar nauwkeurig op 6 decimalen achter de komma, dus deze factor wordt 1.059463.

Met deze factor heeft men (toendertijd, in de jaren 80) de tabel uit de Sid Datasheet berekend en deze waardes zijn keurig overgetikt en gebruikt in het eerste totale ArSid programma.

Tabel of berekenen.

Als eerste rijst de vraag, hoe ga ik de waardes (Midi-frequenties en tussenliggende PitchBend waardes) in de ArSid aanbrengen. Ga ik vooraf een tabel maken, of laat ik ze de Arduino berekenen. Of doe ik een combinatie ervan. Hier zijn enkele argumenten voor (en tegen).

Hierbij is al bekend dat de Sid-chip voor elke frequentie een 16-bits waarde (= 2 bytes) nodig heeft. Er is dan ook vooraf te bepalen hoe veel geheugen een eventuele tabel nodig zou hebben.

  1. Compleet berekenen - Van 1 enkele basis-waarde alles run-time berekenen kost tijd. De basis-waarde moet zo hoog mogelijk wezen, maar een hele lage noot berekenen kan wel te lang duren voor een acceptabel speel resultaat. Deze methode neemt wel de minste geheugen in beslag, want er is immers geen tabel.

  2. Berekenen vanaf een korte tabel met octaaf waardes - Deze methode wordt aangeraden in de Datasheet 6581. Van een korte tabel met basis-waardes van elke noot in de hoogste oktaaf, zijn alle noten van lagere oktaven te berekenen. De methode is door elke waarde te halveren (voor micro-processors is dit hetzelfde als "schuiven naar rechts"). Dit kost ook wat tijd, maar minder dan alles berekenen uit maar 1 basis-waarde. Dat er een kleine tabel nodig is (van 12 waardes, want 12 noten in een oktaaf (geeft 24 bytes)), is goed te overzien. Voor tussenliggende PitchBend waardes zullen aparte berekeningen nodig zijn, of een ietsje grotere tabel.

  3. Bij elke opstart, de tabel laten berekenen - Natuurlijk kan de Arduino elke keer bij het opstarten een komplete tabel vullen met de juiste waardes. Dit kost bij het opstarten wat tijd, maar dit kan gebeuren tijdens het "afspelen" van het Intro-scherm. Na een berekening van hoeveel bytes een complete tabel nodig heeft, valt deze methode al af bij het genereren van 16 PitchBend waardes. De tabel neemt dan 8kB in, net groot genoeg voor de 8kb die de Arduino Mega heeft (voor alle variabelen). Maar een programma heeft ook andere variabelen nodig, dus de tabel kan niet zo groot worden.

  4. Complete tabel van te voren maken - In gebruik is dit wel de snelste methode. Nadeel is wel dat een tabel-grootte van meer dan de 8kB niet meer past in de RAM-geheugen van een Arduino Mega past ... MAAR doordat tabellen met constanten in het programma-geheugen kan worden opgeslagen (PROGMEM) maakt het niet uit of de tabel nu 8kB groot is, of (bijvoorbeeld) 128kB. Ook is deze methode minder flexibel dan berekenen, omdat alles al vast moet liggen. Ook is het veel werk om zo'n tabel te maken, vooral als er veel tussenliggende PitchBend waardes nodig zijn ... Dat is echter wel wel werk, dat gelukkig maar éénmalig gedaan hoeft te worden.

Ik heb gekozen voor de laatste methode: snelheid voor alles. De Arduino heeft ruim 250kB aan (programma) geheugen aan boord, dus software-matig gezien is er ruimte genoeg aanwezig.

PitchBend frquenties.

Maar nu de tussenliggende waardes. Hoe meer tussenliggende waardes men wilt, hoe meer deze factor in de buurt komt van 1.000000. Een factor-grootte waardoor noten niet meer van elkaar gaan verschillen, maar dan wil je wel meer dan een miljoen tussenwaardes hebben.

Uit het geheel volgt dan de volgende tabel:

TussenwaardesWaardes per NootBerekeningFactor 11 decimalen6 decimalenTotaal waardesBytes nodig
Geen 1 2^(1/ 12) 1.059 463 094 35; 1.059463; 256 waardes 512 Bytes
1 2 2^(1/ 24) 1.029 302 236 64; 1.029302; 512 waardes 1 kB
3 4 2^(1/ 48) 1.014 545 334 93; 1.014545; 1024 waardes 2 kB
7 8 2^(1/ 96) 1.007 246 412 22; 1.007246; 2048 waardes 4 kB
15 16 2^(1/192) 1.003 616 665 97; 1.003617; 4096 waardes 8 kB
32 32 2^(1/384) 1.001 806 700 90; 1.001807; 8192 waardes 16 kB
63 64 2^(1/768) 1.000 902 942 79; 1.000903; 16384 waardes 32 kB

Natuurlijk kan er ook gekozen worden voor 10 PitchBend waardes, of 12 of 20. Echter is een macht van 2 (8, 16, 32, etc) makkelijker (en sneller) te verwerken in een digitale omgeving. Immers er hoeven geen extra (tijd kostende) vermenigvuldigingen worden gebruikt, alleen maar schuiven. Binair schuiven gaat altijd sneller dan vermenigvuldigen (of delen).

Spreadsheet.

Eerst is een poging gedaan om de totale tabel te maken met behulp van een spreadsheet programma. Dit bij gebrek aan de handige hulpmiddelen die ik vroeger had, zoals een werkende Cbm64, of een werkende Turbo Pascal, c.q. Borland Pascal omgeving.

Er is een poging gedaan, echter het kostte mij te veel tijd om een totale tabel samen te stellen. Vooral het intikken van de formules valt tegen, omdat goed gecontroleerd moet worden of de juiste vakjes bij de brekeningen worden gebruikt. Ook moeten er diverse waardes met een rekenmachine worden gecontroleerd.

Bij enkele pogingen met kleine tabellen zijn tussen resultaten in een Ascii-Editor binnen gehaald om te formateren tot een C++ tabel. Dit blijkt elke keer weer veel werk te zijn ... Te veel werk voor grote tabellen.

De Arduino Mega zelf.

En toen is de gedachte opgekomen: "Waarom niet de Arduino zelf laten rekenen." Het is bekend terrein voor mij om (massa-)berekeningen zelf te programmeren en het geeft voor mijn gevoel snel een vertrouwd resultaat. Plus ik kan de uitvoer zo maken, zodat deze bijna rechtstreeks als C++ tabel is op te nemen in het ArSid programma. Handig als ik besluit om de tabel te vergroten.

Na een keuze over hoeveel frequenties er tussen twee noten moeten komen (zuiver theoretisch benaderd is het eigenlijk tussen twee halve noten), is de noten generator geboren.

Het programma.

De keuze is eerst gevallen op 7 tussenliggende frequenties. Na een eerste run is het aantal verhoogd naar 15 tussenliggende frequenties. Inclusief de hele waarde voor de noot, wordt het aantal frequenties met 1 verhoogd tot resp. 8 stuks, of 16 stuks (een mooie binaire waarde). Het programma zelf gebruikt alleen de standaard SETUP()-funktie. De LOOP()-funktie blijft leeg.

In het programma is eerst de oude tabel te zien. 1 rij waardes onder elkaar, waarmee met een Midi-noot (waarde -128 .. +127) rechtstreeks de waarde uitkomt die in de Sid moet worden gestopt voor de goede noot-frequentie. Deze tabel vormt de basis voor de tussenliggende waardes.

Vervolgens is met de hand (en rekenmachine) de 16 factoren bepaald voor elke tussenliggende waarde. Al deze factoren zitten in de variabelen PITCH_01_16 t/m Pitch_15_16 (voor 1/16 t/m 15/16).

Een FOR-lus neemt alle waardes uit de gegeven tabel en berekent hieruit de tussenliggende waardes. Al deze waardes worden via de SERIELE Monitor op het scherm gezet. Wat opvalt is dat elke regel meer dan 16 waardes bevatten. De laatste waardes, na het commentaar-teken "//" geven extra waardes, nodig bij de hoogste frequentie.

Top frequentie van de Sid.

De Sid kan geluid voortbrengen tot bijna 3.95kHz. Voor deze 3.95kHz zou er een waarde nodig zijn van 66288 ($01 F2F0), te groot voor een 2 byte getal (max 65535, $FFFF). Nu blijken er boven de hoogst voort te brengen noot nog enkele geldige waardes te liggen, die er niet uitkomen als de reken-frequentie een waarde van $0000 heeft. De extra 6 waardes zijn met de Ascii-Editor gemakkelijk op de juiste plaats te brengen (met hoogste waarde $FF39). Daarmee is de limiet van de Sid-Chip echt wel bereikt.

Bodem frequentie van de Sid.

De laagste waarde gaat echter veel verder door dan door de Midi-noot 0 (de C-1, ongeveer 8.18Hz, Sid-waarde $0089) wordt bepaald. Dit verklaart ook waarom er hier in de frequentie-tabel negatieve waardes voor Midi-noten is opgenomen. De Sid kan tot waarde $0000 gaan.

Op een bepaald moment genereerde het programma toch een mankement bij waardes lager dan $0013. Er werd "geschakeld" tussen de noot-waarde en een waarde lager. Of te wel, er kwam bijvoorbeeld voor: "10 10 10 10 11 11 11 11" en dit over enkele regels. Ook dit is met de Ascii-editor gecorrigeerd.

Het resultaat.

Het resultaat is een tabel, dat (na standaard Windows Knip & Plak) in een Ascii-Editor is in te laden. De paar correcties zijn aangebracht en daarna is de gehele tabel in de Noten-Library van de ArSid gebracht. Uiteindelijk is deze manier van Noten genereren leuker geworden dan tig keer dezelfde handelingen te moeten doen om alle waardes te bepalen.

Ook blijken de waardes, die de Sid voor een frequentie nodig heeft, correct te zijn. Een frequentie die 440Hz (Noot A4) zou geven, is ook 440Hz (zo vertelt het Oscilloscoop beeld).

Wat er dan bij het testen van de gegenereerde tabel blijkt, is dat de basistabel uit de Datasheet enkele foutjes bevat, een "D980" die als "0980" is getypt (nr. 97: G7#), of een "0CC0" die als "0C08" is getypt (nr 40: G3). Deze foutjes zijn daarna gecorrigeerd en er is een nieuwe tabel gegenereerd. 


[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]

Afbeeldingen

notengen_1.jpg
1/2: notengen_1.jpg.
notengen_2.jpg
2/2: notengen_2.jpg.


[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]
Broncode: [1: Noten Generator]

1: De broncode van Noten Generator

(Tue 02 January 2018) Programma om van de Noten-tabel de tussenliggende PitchBend noten te berekenen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
//=======================================================================================
//
// Noten Generator
//
// Prog om van de Noten-tabel de tussenliggende PitchBend noten te berekenen.
//
//=======================================================================================

static const word NoteSid [256] = // = [000..255]   { HexSidFreq - Hele Noot waardes }
                             // Sid Values of the Midi-Notes.
                             { 0x0000 ,   // -128 E-12      0     0.00
                               0x0000 ,   // -127 F-12      0     0.00
                               0x0000 ,   // -126 F-12#     0     0.00
                               0x0000 ,   // -125 G-12      0     0.00
                               0x0000 ,   // -124 G-12#     0     0.00
                               0x0000 ,   // -123 A-12      0     0.00
                               0x0000 ,   // -122 A-12#     0     0.00
                               0x0000 ,   // -121 B-12      0     0.01
                               0x0000 ,   // -120 C-12      0     0.01
                               0x0000 ,   // -119 C-12#     0     0.01
                               0x0000 ,   // -118 D-11      0     0.01
                               0x0000 ,   // -117 D-11#     0     0.01
                               0x0000 ,   // -116 E-11      0     0.01
                               0x0000 ,   // -115 F-11      0     0.01
                               0x0000 ,   // -114 F-11#     0     0.01
                               0x0000 ,   // -113 G-11      0     0.01
                               0x0000 ,   // -112 G-11#     0     0.01
                               0x0000 ,   // -111 A-11      0     0.01
                               0x0000 ,   // -110 A-11#     0     0.01
                               0x0000 ,   // -109 B-11      0     0.02
                               0x0000 ,   // -108 C-10      0     0.02
                               0x0000 ,   // -107 C-10#     0     0.02
                               0x0000 ,   // -106 D-10      0     0.02
                               0x0000 ,   // -105 D-10#     0     0.02
                               0x0000 ,   // -104 E-10      0     0.02
                               0x0000 ,   // -103 F-10      0     0.02
                               0x0000 ,   // -102 F-10#     0     0.02
                               0x0000 ,   // -101 G-10      0     0.02
                               0x0000 ,   // -100 G-10#     0     0.03
                               0x0000 ,   // - 99 A-10      0     0.03
                               0x0000 ,   // - 98 A-10#     0     0.03
                               0x0000 ,   // - 97 B-10      0     0.03
                               0x0000 ,   // - 96 C-9       0     0.03
                               0x0000 ,   // - 95 C-9#      0     0.03
                               0x0000 ,   // - 94 D-9       0     0.04
                               0x0000 ,   // - 93 D-9#      0     0.04
                               0x0000 ,   // - 92 E-9       0     0.04
                               0x0000 ,   // - 91 F-9       0     0.04
                               0x0000 ,   // - 90 F-9#      0     0.05
                               0x0000 ,   // - 89 G-9       0     0.05
                               0x0000 ,   // - 88 G-9#      0     0.05
                               0x0000 ,   // - 87 A-9       0     0.05
                               0x0000 ,   // - 86 A-9#      0     0.06
                               0x0001 ,   // - 85 B-9       1     0.06
                               0x0001 ,   // - 84 C-8       1     0.06
                               0x0001 ,   // - 83 C-8#      1     0.07
                               0x0001 ,   // - 82 D-8       1     0.07
                               0x0001 ,   // - 81 D-8#      1     0.08
                               0x0001 ,   // - 80 E-8       1     0.08
                               0x0001 ,   // - 79 F-8       1     0.09
                               0x0001 ,   // - 78 F-8#      1     0.09
                               0x0001 ,   // - 77 G-8       1     0.10
                               0x0001 ,   // - 76 G-8#      1     0.10
                               0x0001 ,   // - 75 A-8       1     0.11
                               0x0001 ,   // - 74 A-8#      1     0.11
                               0x0002 ,   // - 73 B-8       2     0.12
                               0x0002 ,   // - 72 C-7       2     0.13
                               0x0002 ,   // - 71 C-7#      2     0.14
                               0x0002 ,   // - 70 D-7       2     0.14
                               0x0002 ,   // - 69 D-7#      2     0.15
                               0x0002 ,   // - 68 E-7       2     0.16
                               0x0002 ,   // - 67 F-7       2     0.17
                               0x0003 ,   // - 66 F-7#      3     0.18
                               0x0003 ,   // - 65 G-7       3     0.19
                               0x0003 ,   // - 64 G-7#      3     0.20
                               0x0003 ,   // - 63 A-7       3     0.21
                               0x0003 ,   // - 62 A-7#      3     0.23
                               0x0004 ,   // - 61 B-7       4     0.24
                               0x0004 ,   // - 60 C-6       4     0.26
                               0x0004 ,   // - 59 C-6#      4     0.27
                               0x0004 ,   // - 58 D-6       4     0.29
                               0x0005 ,   // - 57 D-6#      5     0.30
                               0x0005 ,   // - 56 E-6       5     0.32
                               0x0005 ,   // - 55 F-6       5     0.34
                               0x0006 ,   // - 54 F-6#      6     0.36
                               0x0006 ,   // - 53 G-6       6     0.38
                               0x0006 ,   // - 52 G-6#      6     0.41
                               0x0007 ,   // - 51 A-6       7     0.43
                               0x0007 ,   // - 50 A-6#      7     0.46
                               0x0008 ,   // - 49 B-6       8     0.48
                               0x0008 ,   // - 48 C-5       8     0.51
                               0x0009 ,   // - 47 C-5#      9     0.54
                               0x0009 ,   // - 46 D-5       9     0.57
                               0x000A ,   // - 45 D-5#     10     0.61
                               0x000A ,   // - 44 E-5      10     0.64
                               0x000B ,   // - 43 F-5      11     0.68
                               0x000C ,   // - 42 F-5#     12     0.72
                               0x000C ,   // - 41 G-5      12     0.77
                               0x000D ,   // - 40 G-5#     13     0.81
                               0x000E ,   // - 39 A-5      14     0.86
                               0x000F ,   // - 38 A-5#     15     0.91
                               0x0010 ,   // - 37 B-5      16     0.96
                               0x0011 ,   // - 36 C-4      17     1.02
                               0x0012 ,   // - 35 C-4#     18     1.08
                               0x0013 ,   // - 34 D-4      19     1.15
                               0x0014 ,   // - 33 D-4#     20     1.22
                               0x0015 ,   // - 32 E-4      21     1.29
                               0x0016 ,   // - 31 F-4      22     1.36
                               0x0018 ,   // - 30 F-4#     24     1.45
                               0x0019 ,   // - 29 G-4      25     1.53
                               0x001B ,   // - 28 G-4#     27     1.62
                               0x001C ,   // - 27 A-4      28     1.72
                               0x001E ,   // - 26 A-4#     30     1.82
                               0x0020 ,   // - 25 B-4      32     1.93
                               0x0022 ,   // - 24 C-3      34     2.04
                               0x0024 ,   // - 23 C-3#     36     2.17
                               0x0026 ,   // - 22 D-3      38     2.29
                               0x0028 ,   // - 21 D-3#     40     2.43
                               0x002B ,   // - 20 E-3      43     2.58
                               0x002D ,   // - 19 F-3      45     2.73
                               0x0030 ,   // - 18 F-3#     48     2.89
                               0x0033 ,   // - 17 G-3      51     3.06
                               0x0036 ,   // - 16 G-3#     54     3.25
                               0x0039 ,   // - 15 A-3      57     3.44
                               0x003D ,   // - 14 A-3#     61     3.64
                               0x0040 ,   // - 13 B-3      64     3.86
                               0x0044 ,   // - 12 C-2      68     4.09
                               0x0048 ,   // - 11 C-2#     72     4.33
                               0x004D ,   // - 10 D-2      77     4.59
                               0x0051 ,   // -  9 D-2#     81     4.86
                               0x0056 ,   // -  8 E-2      86     5.15
                               0x005B ,   // -  7 F-2      91     5.46
                               0x0061 ,   // -  6 F-2#     97     5.78
                               0x0066 ,   // -  5 G-2     102     6.13
                               0x006c ,   // -  4 G-2#    108     6.49
                               0x0073 ,   // -  3 A-2     115     6.88
                               0x007A ,   // -  2 A-2#    122     7.29
                               0x0081 ,   // -  1 B-2     129     7.72
                               0x0089 ,   //    0 C-1     137     8.18
                               0x0091 ,   //    1 C-1#    145     8.66
                               0x009A ,   //    2 D-1     154     9.18
                               0x00A3 ,   //    3 D-1#    163     9.72
                               0x00AD ,   //    4 E-1     173    10.30
                               0x00B7 ,   //    5 F-1     183    10.92
                               0x00C2 ,   //    6 F-1#    194    11.56
                               0x00CD ,   //    7 G-1     205    12.25
                               0x00D9 ,   //    8 G-1#    217    12.98
                               0x00E6 ,   //    9 A-1     230    13.75
                               0x00F4 ,   //   10 A-1#    244    14.57
                               0x0103 ,   //   11 B-1     259    15.44
                               0x0112 ,   //   12 C0      274    16.35
                               0x0123 ,   //   13 C0#     291    17.32
                               0x0134 ,   //   14 D0      308    18.35
                               0x0146 ,   //   15 D0#     326    19.44
                               0x015A ,   //   16 E0      346    20.60
                               0x016E ,   //   17 F0      366    21.83
                               0x0184 ,   //   18 F0#     388    23.12
                               0x018B ,   //   19 G0      411    24.50
                               0x01B3 ,   //   20 G0#     435    25.96
                               0x01CD ,   //   21 A0      461    27.50
                               0x01E9 ,   //   22 A0#     489    29.14
                               0x0206 ,   //   23 B0      518    30.87
                               0x0225 ,   //   24 C1      549    32.70
                               0x0245 ,   //   25 C1#     581    34.65
                               0x0268 ,   //   26 D1      616    36.71
                               0x028C ,   //   27 D1#     652    38.89
                               0x02B3 ,   //   28 E1      691    41.20
                               0x02DC ,   //   29 F1      732    43.65
                               0x0308 ,   //   30 F1#     776    46.25
                               0x0336 ,   //   31 G1      822    49.00
                               0x0367 ,   //   32 G1#     871    51.91
                               0x039B ,   //   33 A1      923    55.00
                               0x03D2 ,   //   34 A1#     978    58.27
                               0x040C ,   //   35 B1     1036    61.74
                               0x0449 ,   //   36 C2     1097    65.41
                               0x048B ,   //   37 C2#    1163    69.30
                               0x04D0 ,   //   38 D2     1232    73.42
                               0x0519 ,   //   39 D2#    1305    77.78
                               0x0567 ,   //   40 E2     1383    82.41
                               0x05B9 ,   //   41 F2     1465    87.31
                               0x0610 ,   //   42 F2#    1552    92.50
                               0x066C ,   //   43 G2     1644    98.00
                               0x06CE ,   //   44 G2#    1742   103.83
                               0x0735 ,   //   45 A2     1845   110.00
                               0x07A3 ,   //   46 A2#    1955   116.54
                               0x0817 ,   //   47 B2     2071   123.47
                               0x0893 ,   //   48 C3     2195   130.81
                               0x0915 ,   //   49 C3#    2325   138.59
                               0x099F ,   //   50 D3     2463   146.83
                               0x0A32 ,   //   51 D3#    2610   155.56
                               0x0ACD ,   //   52 E3     2765   164.81
                               0x0B72 ,   //   53 F3     2930   174.61
                               0x0C20 ,   //   54 F3#    3104   185.00
                               0x0CC0 ,   //   55 G3     3288   196.00
                               0x0D9C ,   //   56 G3#    3484   207.65
                               0x0E6B ,   //   57 A3     3691   220.00
                               0x0F46 ,   //   58 A3#    3910   233.08
                               0x102F ,   //   59 B3     4143   246.94
                               0x1126 ,   //   60 C4     4390   261.62
                               0x122A ,   //   61 C4#    4650   277.18
                               0x133F ,   //   62 D4     4927   293.66
                               0x1464 ,   //   63 D4#    5220   311.13
                               0x159A ,   //   64 E4     5530   329.63
                               0x16E3 ,   //   65 F4     5859   349.23
                               0x183F ,   //   66 F4#    6207   370.00
                               0x1981 ,   //   67 G4     6577   392.00
                               0x1B38 ,   //   68 G4#    6968   415.30
                               0x1CD6 ,   //   69 A4     7382   440.00
                               0x1E80 ,   //   70 A4#    7821   466.16
                               0x205E ,   //   71 B4     8286   493.88
                               0x224B ,   //   72 C5     8779   523.25
                               0x2455 ,   //   73 C5#    9301   554.37
                               0x267E ,   //   74 D5     9854   587.33
                               0x28C8 ,   //   75 D5#   10440   622.25
                               0x2B34 ,   //   76 E5    11060   659.25
                               0x2DC6 ,   //   77 F5    11718   698.46
                               0x307F ,   //   78 F5#   12415   740.00
                               0x3361 ,   //   79 G5    13153   783.99
                               0x366F ,   //   80 G5#   13935   830.61
                               0x39AC ,   //   81 A5    14764   880.00
                               0x3D1A ,   //   82 A5#   15642   932.33
                               0x40BC ,   //   83 B5    16572   987.77
                               0x4495 ,   //   84 C6    17557  1046.50
                               0x48A9 ,   //   85 C6#   18601  1108.73
                               0x4CFC ,   //   86 D6    19709  1174.66
                               0x518F ,   //   87 D6#   20897  1244.51
                               0x5669 ,   //   88 E6    22121  1318.51
                               0x5B8C ,   //   89 F6    23436  1396.91
                               0x60FE ,   //   90 F6#   24830  1479.98
                               0x6602 ,   //   91 G6    26306  1567.98
                               0x6CDF ,   //   92 G6#   27871  1661.22
                               0x7358 ,   //   93 A6    29528  1760.00
                               0x7A34 ,   //   94 A6#   31234  1864.65
                               0x8178 ,   //   95 B6    33144  1975.53
                               0x892B ,   //   96 C7    35115  2093.00
                               0x9153 ,   //   97 C7#   37203  2217.46
                               0x99F7 ,   //   98 D7    39415  2349.32
                               0xA31F ,   //   99 D7#   41759  2489.01
                               0xACD2 ,   //  100 E7    44242  2637.02
                               0xB719 ,   //  101 F7    46873  2793.83
                               0xC1FC ,   //  102 F7#   49660  2959.95
                               0xCC04 ,   //  103 G7    52613  3135.96
                               0xD9BE ,   //  104 G7#   55741  3322.44
                               0xE6B0 ,   //  105 A7    59056  3520.00
                               0xF467 ,   //  106 A7#   62567  3729.31
                               0x0000 ,   //  107 B7    TooHi  3951.06 *66288  *1F2F0
                               0x0000 ,   //  108 C8    TooHi  4186.00
                               0x0000 ,   //  109 C8#   TooHi  4434.92
                               0x0000 ,   //  110 D8    TooHi  4698.64
                               0x0000 ,   //  111 D8#   TooHi  4978.02
                               0x0000 ,   //  112 E8    TooHi  5274.04
                               0x0000 ,   //  113 F8    TooHi  5587.66
                               0x0000 ,   //  114 F8#   TooHi  5919.90
                               0x0000 ,   //  115 G8    TooHi  6271.92
                               0x0000 ,   //  116 G8#   TooHi  6644.88
                               0x0000 ,   //  117 A8    TooHi  7040.00
                               0x0000 ,   //  118 A8#   TooHi  7458.62
                               0x0000 ,   //  119 B8    TooHi  7902.12
                               0x0000 ,   //  120 C9    TooHi  8372.00
                               0x0000 ,   //  121 C9#   TooHi  8869.84
                               0x0000 ,   //  122 D9    TooHi  9397.28
                               0x0000 ,   //  123 D9#   TooHi  9956.04
                               0x0000 ,   //  124 E9    TooHi 10548.08
                               0x0000 ,   //  125 F9    TooHi 11175.32
                               0x0000 ,   //  126 F9#   TooHi 11839.80
                               0x0000     //  127 G9    TooHi 12543.84
                             };

const char hexchar[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
const byte bitje[8] = {1,2,4,8,16,32,64,128};

char byte2hexchar(byte bb)
{ // Calc the lowest Nibble To a Hex-Char
  return  hexchar[bb & 0x0F];
}

void print2hex (byte bb)
{ Serial.print(byte2hexchar(bb >>  4));
  Serial.print(byte2hexchar(bb));
}

void print4hex (word ww)
{ Serial.print(byte2hexchar(ww >> 12));
  Serial.print(byte2hexchar(ww >>  8));
  Serial.print(byte2hexchar(ww >>  4));
  Serial.print(byte2hexchar(ww));
}

void setup()
{ // put your setup code here, to run once:
  Serial.begin(115200);
  Serial.println("//---------------------------------------------------------------------------------------------------------");
  Serial.println("static const word NoteSid [256 * 16] PROGMEM = // = [0000..4095]    [000..255]*[00..15]");
  Serial.println("                             // Sid Values of the Midi-Notes (to a total of 16 PitchBend values).");
  Serial.print  ("                             //    -8,     -7,     -6,     -5,      -4,     -3,     -2,     -1,");
  Serial.print  ("       0,      1,      2,      3,       4,      5,      6,      7    //");
  Serial.println(" Nr   Note    Sid     Freq  - Nr  - More values to be able to correct things arround element 106 ($EA)");

  // Arduino calculates floats with 6 decimals (an ordinairy calculator does it with 9 decimals)
  float Note_Distance  = 1.059463;    // 2^ (1/ 12)
  float Pitch_15_16    = 1.055645;
  float Pitch_14_16    = 1.051841;
  float Pitch_13_16    = 1.048051;
  float Pitch_12_16    = 1.044274;
  float Pitch_11_16    = 1.040511;
  float Pitch_10_16    = 1.036761;
  float Pitch_09_16    = 1.033025;
  float Pitch_08_16    = 1.029302;    // 2^ (1/ 24)
  float Pitch_07_16    = 1.025593;
  float Pitch_06_16    = 1.021897;
  float Pitch_05_16    = 1.018215;
  float Pitch_04_16    = 1.014545;    // 2^ (1/ 48)
  float Pitch_03_16    = 1.010890;
  float Pitch_02_16    = 1.007246;    // 2^ (1/ 96)
  float Pitch_01_16    = 1.003617;    // 2^ (1/192)
  // Next step would be 32 steps      // 2^ (1/384)

  for (word qq=0; qq<=255; qq=qq+1)
      { // Now calculate the whole bunch
        Serial.print("                               0x");
        print4hex(NoteSid[qq] / Pitch_08_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] / Pitch_07_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] / Pitch_06_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] / Pitch_05_16 );  Serial.print(",  0x");

        print4hex(NoteSid[qq] / Pitch_04_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] / Pitch_03_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] / Pitch_02_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] / Pitch_01_16 );  Serial.print(",  0x");

        print4hex(NoteSid[qq]);                 Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_01_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_02_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_03_16 );  Serial.print(",  0x");

        print4hex(NoteSid[qq] * Pitch_04_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_05_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_06_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_07_16 );  Serial.print(",   // ");

        Serial.print(int(qq-128),DEC);          Serial.print("                       -  ");

        print2hex(qq);                          Serial.print(" - ");

        print4hex(NoteSid[qq] * Pitch_08_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_09_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_10_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_11_16 );  Serial.print(", 0x");

        print4hex(NoteSid[qq] * Pitch_12_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_13_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_14_16 );  Serial.print(", 0x");
        print4hex(NoteSid[qq] * Pitch_15_16 );  Serial.print(", 0x");

        print4hex(NoteSid[qq+1]);               Serial.print("   idx[");
        Serial.print( qq * 16 );                Serial.print("]..[");
        Serial.print( qq * 16 + 15 );           Serial.print("]")
;

        Serial.println("");
      }
  Serial.println("//---------------------------------------------------------------------------------------------------------");
}

void loop()
{ // put your main code here, to run repeatedly:

  // Nothing to do here.

}



Broncode: [1: Noten Generator]
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]