Noten spielen mit SetChannelRate

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Ratchet

Betreff: Noten spielen mit SetChannelRate

BeitragMi, Sep 07, 2011 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Funktion CalculateRate soll die Rate für eine Note berechnen die ich dann mit SetChannelRate verwenden möchte. Übergeben wird die Note (siehe Konstanten), die Oktave in der gespielt werden soll, und die Basis-Oktave. Die Basis-Oktave ist 4, das bedeutet in Oktave 4 wird die Note C mit Rate 1 abgespielt, also ganz normal so wie man den Sound geladen hat. Die Oktave kann von 1 bis 8 gehen, sodass ich ein Spektrum von eben 8 Oktaven habe - der Ausgangssound liegt also in der Mitte.

Das funktioniert auch für die Oktaven 3-5, bei den anderen habe ich merkwürdige Effekte, dass z.B. ein C auf einmal ein G der Oktave darunter ist. Irgendwas ist doch hier oberfaul. Meine Formel ist bestimmt absoluter Schwachsinn, oder? Bloss ich komme da einfach nicht weiter.


BlitzMax: [AUSKLAPPEN]
Const NOTE_C: Byte    = 0
Const NOTE_Cm: Byte = 1
Const NOTE_D: Byte = 2
Const NOTE_Dm: Byte = 3
Const NOTE_E: Byte = 4
Const NOTE_F: Byte = 5
Const NOTE_Fm: Byte = 6
Const NOTE_G: Byte = 7
Const NOTE_Gm: Byte = 8
Const NOTE_A: Byte = 9
Const NOTE_Am: Byte = 10
Const NOTE_B: Byte = 11

Function CalculateRate: Float(Note: Byte, Octave: Int, BaseOctave: Int)
Local Result: Float = 1
If Octave >= BaseOctave Then
Result = 2.0 ^ (Note / 12.0) * ((Octave - BaseOctave) + 1)
Else
Result = 2.0 ^ (Note / 12.0) / (BaseOctave - Octave + 1)
End If
Return Result
End Function
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Midimaster

BeitragMi, Sep 07, 2011 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
die korrekte formel lautet:

FrquenzHalbton = OktavFrequenz * Halbton * 1.0594631


Also z.b. "A"=440 Hz, dann ist "Bb"= (440* 1 * 1.0594631)Hz, und "H"= 440* 2 * 1.0594631

damit kommst Du ziemlich genau auf das nächste A, was dann 880Hz ergibt

Die Channelrate verhält sich ebenso. Daraus ergeben sich die folgenden Umrechnungsfaktoren:

Code: [AUSKLAPPEN]
0.Ton  f= 1.00000000
1.Ton  f= 1.05946314
2.Ton  f= 1.12246203
3.Ton  f= 1.18920708 
4.Ton  f= 1.25992107  ; C:E = wie 4:5  theoretisch 1 : 1.250
5.Ton  f= 1.33483982  ; C:F = wie 3:4  theoretisch 1 : 1.333
6.Ton  f= 1.41421354
7.Ton  f= 1.49830711  ; C:G = wie 2:3 theoretisch 1 : 1.500
8.Ton  f= 1.58740103
9.Ton  f= 1.68179286
10.Ton  f= 1.78179741
11.Ton  f= 1.88774860
12.Ton  f= 2.00000000  ; C:C = wie 1:2 theoretisch 2 : 2.000




Die Oktave ist immer ...
Code: [AUSKLAPPEN]
OKT= INT(Note/12)


Der Halbton immer ...

Code: [AUSKLAPPEN]
HT = Note Mod 12


Die Frequenz:

Code: [AUSKLAPPEN]
440* (2^OKT) * 2^(HT/12)



In deiner Formel steckt der Fehler also nur im Oktav-Teil der Frequenz

statt
Code: [AUSKLAPPEN]
Result = 2.0 ^ (Note / 12.0) * ((Octave - BaseOctave) + 1)


muss es heißen:
Code: [AUSKLAPPEN]
Result = 2.0 ^ (Note / 12.0) * (2.0^(Octave - BaseOctave) )


eine Unterscheidung in zwei Fälle ist dann auch nicht mehr nötig!
  • Zuletzt bearbeitet von Midimaster am Mi, Sep 07, 2011 19:45, insgesamt 2-mal bearbeitet

Ratchet

BeitragMi, Sep 07, 2011 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Tausend Dank, Midimaster! ich habe es eben noch einmal selber versucht, aber das ist mir einfach zu hoch. Die Logik dahinter hatte ich zwar verstanden, du hattest mir dazu schon mal netterweise viel Material geschickt, aber das umsetzen in eine vernünftige Formel wollte halt nicht. Danke danke Smile
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group