Differenze tra le versioni di "Ottenere la frequenza corrispondente ad una nota Midi e viceversa"
Riga 196: | Riga 196: | ||
* http://www.sengpielaudio.com/calculator-notenames.htm | * http://www.sengpielaudio.com/calculator-notenames.htm | ||
* https://newt.phys.unsw.edu.au/jw/notes.html | * https://newt.phys.unsw.edu.au/jw/notes.html | ||
+ | * http://midi.teragonaudio.com/tutr/notefreq.htm |
Versione delle 08:48, 14 ago 2024
Indice
Ottenere la frequenza corrispondente ad una nota Midi
Come è noto, nel Midi le note sono numerate da 0 a 127.
Per ottenere la frequenza corrispondente ad una nota Midi e viceversa, sono possibili almeno quattro modalità.
Uso delle sole funzioni di Gambas
Il calcolo della frequenza può essere effettuato mediante almeno due modalità.
In entrambe le possibilità poniamo il caso di voler trovare la frequenza sonora, alla quale corrisponde la nota Midi num. 69 (LA).
1a modalità
Public Sub Main()
Dim frequenza As Single
Dim nota_Midi As Byte
' Otteniamo per esempio il numero della nota Midi corrispondente al La (hz 440) corrispondente numero 69:
nota_Midi = 69
' La frequenza di riferimento è quella del Do dell'ottava n. 0, nota Midi n. 12, (hz 16.3516):
frequenza = 16.3516 * (2 ^ (1 / 12)) ^ (nota_Midi - 12)
Print "Frequenza = "; frequenza; " Hertz"
End
2a modalità
Private Const M_LN2l As Float = 0.69314718055995 Public Sub Main() Dim nota_midi, freq As Single nota_midi = 69 freq = Exp(((nota_midi + 3.0) / 12.0) * M_LN2l) * 6.875 Print "La nota Midi "; nota_midi; " = "; freq; " hertz" End
4a modalità
Public Sub Main() Dim freq As Float Dim nota_midi As Integer nota_midi = 69 freq = Exp(Log(440.0) + CFloat(midi - 69) * Log(2.0) / 12.0) Print "La nota Midi "; nota_midi; " = "; freq; " hertz" End
Ottenere una lista delle note musicali e relative ottave e frequenze di una tastiera musicale da 88 tasti
Private Const NUM_NOTE As Byte = 88 Public Sub Main() Dim nome As String[] = ["DO", "DO#", "RE", "RE#", "MI", "FA", "FA#", "SOL", "SOL#", "LA", "LA#", "SI"] Dim b As Byte Print "NOTA OTTAVA FREQUENZA" For b = 0 To NUM_NOTE - 1 Print NomeNote(nome, b), Ottave(b), Frequenza(b + 1); " hertz" Next End Private Function NomeNote(nomen As String[], n As Byte) As String Return nomen[((n) + 9) Mod 12] End Private Function Ottave(n As Byte) As Byte Return (((n) + 9) / 12) End Private Function Frequenza(n As Byte) As Short Return CShort((2 ^ (1.0 / 12.0)) ^ (n - 49.0) * 440.0 + 0.5) End
Uso dell'API di Libaubio
La libreria Libaubio consente, fra l'altro, di convertire una nota Midi nella corrispondente frequenza sonora.
Per poter fruire in Gambas delle risorse della libreria Libaubio, è necessario installare nel sistema e richiamare in Gambas la libreria dinamica condivisa: "libaubio:4.0.0"
Mostriamo un esempio pratico:
Library "libaubio:4.0.0" ' smpl_t aubio_miditofreq (smpl_t midi) ' Convert midi value (0-128) to frequency (Hz). Private Extern aubio_miditofreq(midi As Single) As Single Public Sub Main() Dim freq, mid As Single mid = 69 freq = aubio_miditofreq(mid) Print "\n\nNota Midi "; mid; "\nFrequenza: hz "; freq End
Ottenere la nota Midi corrispondente ad una frequenza sonora
Per ottenere la nota Midi corrispondente ad una la frequenza sonora, sono possibili almeno quattro modalità.
Uso delle sole funzioni di Gambas
Il calcolo del numero della nota Midi mediante le sole risorse di Gambas può essere effettuato mediante almeno due modalità.
1a modalità
Public Sub Main() Dim freq, nota As Float freq = 440.00
nota = Log(((freq / 261.63) ^ 12) * (2 ^ 60)) / Log(2) Print Round(nota) End
2a modalità
Private Const M_LN2l As Float = 0.69314718055995 Public Sub Main() Dim nota_midi, freq As Single freq = 440.0 nota_midi = ((Log(freq / 6.875) / M_LN2l) * 12) - 3 Print "La frequenza Hz "; freq; " = nota Midi "; nota_midi End
3a modalità
Public Sub Main() Dim freq As Float Dim nota_midi As Byte freq = 440.0 nota_midi = CByte((0.5 + 69.0 + 12.0 / Log(2.0) * Log(f / 440.0))) Print "La frequenza Hz "; freq; " = nota Midi "; nota_midi End
Uso dell'API di Libaubio
Mostriamo un esempio pratico con l'API della libreria Libaubio:
Library "libaubio:4.0.0" ' smpl_t aubio_freqtomidi (smpl_t freq) ' Convert frequency (Hz) to midi value (0-128). Private Extern aubio_freqtomidi(freq As Single) As Single Public Sub Main() Dim frequenza, mid As Single frequenza = 440.0 mid = aubio_freqtomidi(frequenza) Print "Frequenza: hz "; frequenza; "\nNota Midi "; mid End