Ottenere la frequenza corrispondente ad una nota Midi e viceversa

Da Gambas-it.org - Wikipedia.

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 tre 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

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



Riferimenti