Differenze tra le versioni di "Ottenere la frequenza corrispondente ad una nota Midi e viceversa"
(9 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 2: | Riga 2: | ||
Come è noto, nel Midi le note sono numerate da 0 a 127. | 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 | + | Per ottenere la frequenza corrispondente ad una nota Midi e viceversa, sono possibili almeno quattro modalità. |
==Uso delle sole funzioni di Gambas== | ==Uso delle sole funzioni di Gambas== | ||
Riga 10: | Riga 10: | ||
===1<SUP>a</sup> modalità=== | ===1<SUP>a</sup> modalità=== | ||
− | + | Public Sub Main() | |
− | Dim frequenza As | + | Dim frequenza As Single |
Dim nota_Midi As Byte | Dim nota_Midi As Byte | ||
<FONT Color=gray>' ''Otteniamo per esempio il <SPAN Style="text-decoration:underline">numero</span> della nota Midi corrispondente al La (hz 440) corrispondente numero 69:''</font> | <FONT Color=gray>' ''Otteniamo per esempio il <SPAN Style="text-decoration:underline">numero</span> della nota Midi corrispondente al La (hz 440) corrispondente numero 69:''</font> | ||
− | + | nota_Midi = 69 | |
− | + | ||
− | <FONT Color=gray>' ''La frequenza di riferimento è quella del Do | + | <FONT Color=gray>' ''La frequenza di riferimento è quella del Do dell'ottava n. 0, nota Midi n. 12, (hz 16.3516):''</font> |
− | + | frequenza = <FONT Color=#B222222>16.3516 * (2 ^ (1 / 12)) ^ (nota_Midi - 12)</font> | |
− | + | Print "Frequenza = "; frequenza; " Hertz" | |
− | + | End | |
Riga 30: | Riga 30: | ||
− | + | Public Sub Main() | |
− | + | ||
Dim nota_midi, freq As Single | Dim nota_midi, freq As Single | ||
+ | |||
+ | nota_midi = 69 | ||
+ | |||
+ | freq = <FONT Color=#B222222>Exp(((nota_midi + 3.0) / 12.0) * M_LN2l) * 6.875</font> | ||
+ | |||
+ | Print "La nota Midi "; nota_midi; " = "; freq; " hertz" | ||
− | + | End | |
+ | |||
+ | ===4<SUP>a</sup> modalità=== | ||
+ | Public Sub Main() | ||
+ | |||
+ | Dim freq As Float | ||
+ | Dim nota_midi As Integer | ||
+ | |||
+ | nota_midi = 69 | ||
+ | |||
+ | freq = <FONT Color=#B222222>Exp(Log(440.0) + CFloat(midi - 69) * Log(2.0) / 12.0)</font> | ||
− | + | 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== | ==Uso dell'API di Libaubio== | ||
Riga 46: | Riga 98: | ||
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''" | 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: | Mostriamo un esempio pratico: | ||
Riga 56: | Riga 107: | ||
− | + | Public Sub Main() | |
Dim freq, mid As Single | 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= | =Ottenere la nota Midi corrispondente ad una frequenza sonora= | ||
− | Per ottenere la nota Midi corrispondente ad una la frequenza sonora, sono possibili almeno | + | Per ottenere la nota Midi corrispondente ad una la frequenza sonora, sono possibili almeno quattro modalità. |
==Uso delle sole funzioni di Gambas== | ==Uso delle sole funzioni di Gambas== | ||
Riga 76: | Riga 127: | ||
===1<SUP>a</sup> modalità=== | ===1<SUP>a</sup> modalità=== | ||
− | <FONT Color= | + | Public Sub Main() |
+ | |||
+ | Dim freq, nota As Float | ||
+ | |||
+ | freq = 440.00 | ||
+ | |||
+ | nota = <FONT Color=#B222222>Log(((freq / 261.63) ^ 12) * (2 ^ 60)) / Log(2)</font> | ||
+ | |||
+ | Print Round(nota) | ||
+ | |||
+ | End | ||
===2<SUP>a</sup> modalità=== | ===2<SUP>a</sup> modalità=== | ||
Riga 82: | Riga 143: | ||
− | + | Public Sub Main() | |
Dim nota_midi, freq As Single | Dim nota_midi, freq As Single | ||
+ | |||
+ | freq = 440.0 | ||
+ | |||
+ | nota_midi = <FONT Color=#B222222>((Log(freq / 6.875) / M_LN2l) * 12) - 3</font> | ||
− | + | Print "La frequenza Hz "; freq; " = nota Midi "; nota_midi | |
− | + | End | |
+ | |||
+ | ===3<SUP>a</sup> modalità=== | ||
+ | Public Sub Main() | ||
+ | |||
+ | Dim freq As Float | ||
+ | Dim nota_midi As Byte | ||
+ | |||
+ | freq = 440.0 | ||
− | + | nota_midi = <FONT Color=#B222222>CByte((0.5 + 69.0 + 12.0 / Log(2.0) * Log(f / 440.0)))</font> | |
+ | |||
+ | Print "La frequenza Hz "; freq; " = nota Midi "; nota_midi | ||
− | + | End | |
==Uso dell'API di Libaubio== | ==Uso dell'API di Libaubio== | ||
Riga 103: | Riga 178: | ||
− | + | Public Sub Main() | |
Dim frequenza, mid As Single | Dim frequenza, mid As Single | ||
− | |||
− | |||
− | + | frequenza = 440.0 | |
− | + | ||
+ | mid = aubio_freqtomidi(frequenza) | ||
+ | Print "Frequenza: hz "; frequenza; "\nNota Midi "; mid | ||
− | + | End | |
Riga 119: | Riga 194: | ||
=Riferimenti= | =Riferimenti= | ||
* http://aubio.org/ | * http://aubio.org/ | ||
+ | * http://www.sengpielaudio.com/calculator-notenames.htm | ||
+ | * https://newt.phys.unsw.edu.au/jw/notes.html |
Versione attuale delle 07:40, 15 ott 2023
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