Differenze tra le versioni di "Ottenere la frequenza corrispondente ad una nota Midi e viceversa"

Da Gambas-it.org - Wikipedia.
 
(11 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 tre modalità.
+
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()
+
  Public Sub Main()
 
   
 
   
   Dim frequenza As Float
+
   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
+
  nota_Midi = 69
 
+
  <FONT Color=gray>' ''La frequenza di riferimento è quella del Do centrale (hz 261,63):''</font>
+
  <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>261.63 * (2 ^ (1 / 12)) ^ (nota_Midi - 60)</font>
+
  frequenza = <FONT Color=#B222222>16.3516 * (2 ^ (1 / 12)) ^ (nota_Midi - 12)</font>
 
   
 
   
  Print "Frequenza = hz";; frequenza
+
  Print "Frequenza = "; frequenza; " Hertz"
 
   
 
   
  '''End'''
+
  End
  
  
Riga 30: Riga 30:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 +
 +
  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
 
    
 
    
   Dim nota_midi, freq As Single
+
   Return nomen[((n) + 9) Mod 12]
 
    
 
    
    nota_midi = 69
+
End
   
+
    freq = (nota_midi + 3.0) / 12.0
+
   
+
Private Function Ottave(n As Byte) As Byte
    freq = Exp(freq * M_LN2l)
+
   
+
  Return (((n) + 9) / 12)
    freq *= 6.875
+
   
+
End
    Print "La nota Midi "; nota_midi; " = "; freq; " hertz"
+
 
+
  '''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 50: 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 60: Riga 107:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim freq, mid As Single
 
   Dim freq, mid As Single
 
+
    mid = 69
+
  mid = 69
 +
 +
  freq = aubio_miditofreq(mid)
 +
  Print "\n\nNota Midi    "; mid; "\nFrequenza: hz "; freq
 
    
 
    
    freq = aubio_miditofreq(mid)
+
  End
    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 tre modalità.
+
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 80: Riga 127:
  
 
===1<SUP>a</sup> modalità===
 
===1<SUP>a</sup> modalità===
<FONT Color=red size=4>Paragrafo in costruzione !</font>
+
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 86: Riga 143:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  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>
 
    
 
    
    freq = 440.0
+
  Print "La frequenza Hz "; freq; " = nota Midi "; nota_midi
 
      
 
      
    nota_midi = ((Log(freq / 6.875) / M_LN2l) * 12) - 3
+
End
 +
 
 +
===3<SUP>a</sup> modalità===
 +
Public Sub Main()
 +
 
 +
  Dim freq As Float
 +
  Dim nota_midi As Byte
 +
 +
  freq = 440.0
 
    
 
    
    Print "La frequenza Hz "; freq; " = nota Midi "; nota_midi
+
  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'''
+
  End
  
 
==Uso dell'API di Libaubio==
 
==Uso dell'API di Libaubio==
Mostriamo un esempio pratico:
+
Mostriamo un esempio pratico con l'API della libreria ''Libaubio'':
 
  Library "libaubio:4.0.0"
 
  Library "libaubio:4.0.0"
 
    
 
    
  <FONT Color=gray>' ''smpl_t aubio_miditofreq (smpl_t midi)''
+
  <FONT Color=gray>' ''smpl_t aubio_freqtomidi (smpl_t freq)''
  ' ''Convert midi value (0-128) to frequency (Hz).''</font>
+
  ' ''Convert frequency (Hz) to midi value (0-128).''</font>
  Private Extern aubio_miditofreq(midi As Single) As Single
+
  Private Extern aubio_freqtomidi(freq As Single) As Single
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
   Dim freq, mid As Single
+
   Dim frequenza, mid As Single
 
 
    freq = 440.0
 
 
    
 
    
    mid = aubio_freqtomidi(freq)
+
  frequenza = 440.0
    Print "Frequenza: hz "; freq; "\nNota Midi    "; mid
+
 +
  mid = aubio_freqtomidi(frequenza)
 +
  Print "Frequenza: hz "; frequenza; "\nNota Midi    "; mid
 
    
 
    
  '''End'''
+
  End
  
  
Riga 123: 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

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