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



Riferimenti