' **************************************** ' * * ' * calculator for motor speeds * ' * calculator for note repetitions * ' * and logaritmic velocity scalings * ' **************************************** $DIM ALL DECLARE FUNCTION ggd (BYVAL a AS DWORD, BYVAL b AS DWORD) AS DWORD FUNCTION PBMAIN ()AS LONG CONSOLE SCREEN 60,80 LOCAL time_unit AS DOUBLE LOCAL divider AS WORD LOCAL i AS INTEGER DIM Periods(0 TO 127) AS WORD DIM Freqs(0 TO 127) AS SINGLE DIM RealFreqs(0 TO 127) AS SINGLE OPEN "P24-note-table.inc" FOR OUTPUT AS #1 divider = 64 ' possible values: 1,2,4,8,16,32,64 time_unit = 1.0/ 120.0E6 ' 120MHz clock = 8.33ns ' midi noot 22 (sib) = 29.135235 PRINT#1, "' midi-note to period lookup for PIC24 with 120MHz clock" PRINT#1, "' time_unit = " & STR$(time_unit) PRINT#1, "' divider set to = " & STR$(divider) PRINT#1, "' lowest note = midi 22 (Sib) , freq = 29.1355235 Hz" PRINT#1, " " PRINT#1, "Period_Lookup_Table:" FOR i = 22 TO 127 Freqs(i) = 29.135235 * (2^((i-22)/12)) Periods(i) = (1.0 / Freqs(i)) / (time_unit * divider) RealFreqs(i) = (1.0 / (Periods(i) * time_unit * divider)) PRINT#1, "Period[" & TRIM$(STR$(i)) & "]="; STR$(Periods(i)); " ' soll frequency =" ; STR$(freqs(i)) ; " real frequency = "; STR$(RealFreqs(i)) NEXT i PRINT#1, "RETURN" PRINT#1, "' EOF" CLOSE #1 DO: LOOP UNTIL INKEY$ <> "" CLOSE #1 END FUNCTION FUNCTION ggd (BYVAL a AS DWORD, BYVAL b AS DWORD) AS DWORD ' algoritme van Euclides voor de berekening van de grootste gemene deler van twee getallen ' 31.03.2012: gwr - checked o.k. LOCAL rest AS INTEGER IF a < b THEN SWAP a,b ' a must be > b IF ISFALSE b THEN FUNCTION = 0 : EXIT FUNCTION DO rest = a MOD b a = b b = rest LOOP WHILE rest '<> 0 FUNCTION = a END FUNCTION