vd-archiv:listings:4d2013-01-listings
**Dies ist eine alte Version des Dokuments!**
4d2013-01 Listings
Wave Engine (5)
\ -------1---------2---------3---------4---------5-----|
cr cr ." Last edit: 22feb2013 22:40" cr
\ ######################################################
\ Aus Tonnummer (1...478, entspr. ,,C ... c""") Frequenz
\ und Phasenschritt berechnen. Die Schrittwerte werden
\ in Tabellen geladen und dort vom Generator ausgelesen.
\ ######################################################
\
\ Ausgehend vom "Kammerton" a' mit 440 Hz ergeben sich
\ für den tiefsten (Subkontra-)Ton ,,C je nach Stimmung
\ unterschiedliche Frequenzen:
\
\ Reine Stimmung (Oktaven 1:2 und Quinten 2:3):
\ Von a' aus 3 Quinten (3/2) und 3 Oktaven (2/1) tiefer:
\ freq = 440/((3/2)^3*(2/1)^3) = 16,29630 [Hz]
\ (Nur zum Vergleich, nicht verwendet)
\
\ Fast reine temperierte Stimmung mit 53stel Oktaven:
\ Von a' aus 40+4*53 = 252 Kommas (2^(1/53)) tiefer:
\ freq = 440/(2^(1/53))^252 = 16,29822 [Hz]
\
\ Die übliche temperierte Stimmung mit Zwölftel-Oktaven:
\ Von a' aus 9+4*12 = 57 Halbtöne (2^(1/12)) tiefer:
\ freq = 440/(2^(1/12))^57 = 16,35160 [Hz]
\
\ Der vom Sinus-Generator benötigte Phasenschritt wird
\ aus der Frequenz nach folgender Formel berechnet:
\ step = freq * 2pi / frames/sec [rad (Bogenmaß)]
\
\ Bei einer Auflösung von 44100 frames/sec beträgt der
\ Phasenschritt für den tiefsten Ton:
\ step = 16,29822 * 2pi / 44100 = 0,002322103 [rad]
\ bzw. step = 16,35160 * 2pi / 44100 = 0,002329708 [rad]
\
\ Dasselbe für den höchsten Ton c""", 9 Oktaven höher:
\ step = 8344,690 * 2pi / 44100 = 1,188917 [rad]
\ bzw. step = 8372,018 * 2pi / 44100 = 1,192810 [rad]
\
\ ======================================================
2e 1e 53e f/ f** fconstant 53root2 \ 2^(1/53) Komma
2e 1e 12e f/ f** fconstant 12root2 \ 2^(1/12) Halbton
pi 2e f* fconstant 2pi
fvariable 440Hz
440e 440Hz f! \ Stimmgabel
fvariable frames \ Auflösung
44100e frames f! \ Draft: 11025e
\ ------------------------------------------------------
\ Frequenz des tiefsten Tons der "53er"-Tabelle finden
: base53 ( r-440Hz -- r-freq) 53root2 252e f** f/ ;
\ Frequenz eines Tons der "53er"-Tabelle berechnen
: freq53 ( r-440Hz offs53 -- r-freq)
base53 53root2 s>f f** f* ;
\ ------------------------------------------------------
\ Frequenz des tiefsten Tons der "12er"-Tabelle finden
: base12 ( r-440Hz -- r-freq) 12root2 57e f** f/ ;
\ Frequenz eines Tons der "12er"-Tabelle berechnen
: freq12 ( r-440Hz offs12 -- r-freq)
base12 12root2 s>f f** f* ;
\ ------------------------------------------------------
\ Aus der Frequenz den Phasenschritt berechnen
: freq>step ( r-freq -- r-step) 2pi f* frames f@ f/ ;
\ Wandlung des "53er"-Offset in den "12er"-Offset
: shrink ( offs53 -- offs12) 12 * 22 + 53 / ;
\ ======================================================
\ Tabelle für die "53er"-Temperatur anlegen
478 dup constant ftab53-items \ 9*53 (9 Oktaven) +1
8 * dup constant ftab53-size \ 8-byte-Zellen
create ftab53 allot \ 3824 bytes
\ Aus dem Offset Adresse in "53er"-Tabelle berechnen.
: fadr53 ( offs53 -- addr) 8 * ftab53 + ;
\ Füllen der Tabelle für die "53er"-Temperatur
: fill-ftab53 ( r-440Hz --)
base53 freq>step \ Anfangston 16,3 Hz
ftab53-items \ Anzahl Float-Werte
0 DO fdup i fadr53 f! \ Float-Wert laden
53root2 f* \ 1/53 Oktave höher
LOOP fdrop ;
\ Per Tonnummer Phasenschritt aus Tabelle ftab53 holen
: f53@ ( Ton# -- r-step) 1- fadr53 f@ ;
\ ======================================================
\ Tabelle für die "12er"-Temperatur anlegen
109 dup constant ftab12-items \ 9*12 (9 Oktaven) +1
8 * dup constant ftab12-size \ 8-byte-Zellen
create ftab12 allot \ 872 bytes
\ Aus dem Offset Adresse in "12er"-Tabelle berechnen.
: fadr12 ( offs12 -- addr) 8 * ftab12 + ;
\ Füllen der Tabelle für die "12er"-Temperatur
: fill-ftab12 ( r-440Hz --)
base12 freq>step \ Anfangston 16,3 Hz
ftab12-items \ Anzahl Float-Werte
0 DO fdup i fadr12 f! \ Float-Wert laden
12root2 f* \ 1/12 Oktave höher
LOOP fdrop ;
\ Per Tonnummer Phasenschritt aus Tabelle ftab12 holen
: f12@ ( Ton# -- r-step) 1- shrink fadr12 f@ ;
\ ======================================================
\ shrink reduziert die (durch die spezielle Syntax sich
\ ergebenden) 53 Töne pro Oktave auf 12 Töne pro Oktave,
\ zum Auslesen der kleineren "12er"-Tabelle.
\
\ Syntax C B# C\\ Db/ Db C# B## D// Ebb D C## Eb\\
\ Ton# 1 2 3 4 5 6 7 8 9 10 11 12
\ offs53 0 1 2 3 4 5 6 7 8 9 10 11
\ offs12 0 0 1 1 1 1 2 2 2 2 2 3
\ Piano C --- Cis ---------- D --------------- Dis
\
\ Oktave 0 Oktave 1 Oktave 9
\ ("Subkontra") ("Kontra") ("6-gestr.")
\ Ton# Offs Ton# Offs Ton# Offs
\ C 1-2 -> 0 52-55 -> 12 476-478 -> 108
\ Cis/Des 3-6 -> 1 56-59 -> 13 --------------
\ D 7-11 -> 2 60-64 -> 14
\ Dis/Es 12-15 -> 3 65-68 -> 15
\ E 16-20 -> 4 69-73 -> 16
\ F 21-24 -> 5 --------------
\ Fis/Ges 25-29 -> 6 449-453 -> 102
\ G 30-33 -> 7 454-457 -> 103
\ Gis/As 34-37 -> 8 458-461 -> 104
\ A 38-42 -> 9 462-466 -> 105
\ Ais/B 43-46 -> 10 467-470 -> 106
\ H 47-51 -> 11 471-475 -> 107
\ ======================================================
440Hz f@ fill-ftab53
440Hz f@ fill-ftab12
\ ======================================================
0 [if] \ Zum Testen mit "1" einschalten
cr ." +---------------------------+"
cr ." | Die Tabellen sind geladen |"
cr ." +---------------------------+"
cr
cr ." Stacks: " .s f.s \ must be zero
cr
cr ." Beispiele für die Konsole:"
cr
cr ." 7 set-precision"
cr
cr ." 440e base53 f. => 16.29822 Basisfrequenz"
cr ." 440e 0 freq53 f. => 16.29822 Freq Ton #1"
cr ." 440e 53 freq53 f. => 32.59645 Freq Ton #54"
cr ." 440e 477 freq53 f. => 8344.690 Freq Ton #478"
cr ." ftab53 f@ f. => 0.002322103 Step Ton #1"
cr ." 0 fadr53 f@ f. => 0.002322103 Step Ton #1"
cr ." 1 f53@ f. => 0.002322103 Step Ton #1"
cr ." 477 fadr53 f@ f. => 1.188917 Step Ton #478"
cr ." 478 f53@ f. => 1.188917 Step Ton #478"
cr
cr ." 440e base12 f. => 16.35160 Basisfrequenz"
cr ." 440e 0 freq12 f. => 16.35160 Freq Ton #1"
cr ." 440e 12 freq12 f. => 32.70320 Freq Ton #13"
cr ." 440e 108 freq12 f. => 8372.018 Freq Ton #109"
cr ." ftab12 f@ f. => 0.002329708 Step Ton #1"
cr ." 0 fadr53 f@ f. => 0.002329708 Step Ton #1"
cr ." 1 f53@ f. => 0.002329708 Step Ton #1"
cr ." 108 fadr12 f@ f. => 1.192810 Step Ton #478"
cr ." 478 f12@ f. => 1.192810 Step Ton #478"
cr cr
[endif]
\ ======================================================
vd-archiv/listings/4d2013-01-listings.1495464876.txt.gz · Zuletzt geändert: 2017-05-22 16:54 von mka