Differenze tra le versioni di "Eseguire un file MIDI mediante il componente gb.sdl2.audio"

Da Gambas-it.org - Wikipedia.
 
(24 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Le risorse della libreria ''SDL2'' per la gestione dell'audio e del Midi sono state implementate in Gambas attraverso il nuovo componente '''''gb.sdl2.audio'''''.
+
Le risorse della libreria ''SDL2'' per la gestione dell'audio e del Midi sono state implementate in Gambas attraverso il Componente ''gb.sdl2.audio'' il quale può essere attivato anche indipendentemente dal Componente ''gb.sdl2'' .  
<BR>Va sottolineato che il componente ''gb.sdl2.audio'' può essere attivato anche indipendentemente dal componente ''gb.sdl2'' .  
 
  
Il componente fornisce per l'esecuzione dei file Midi la Classe " ''Music'' ". E' possibile eseguire un solo file Midi per volta.
+
Il Componente ''gb.sdl2.audio'' fornisce per l'esecuzione dei file Midi la Classe ''Music''.
 +
<BR>E' possibile eseguire <SPAN Style="text-decoration:underline">un solo</span> file Midi per volta.
  
E' necessario impostare nella proprietà ''Music.SoundFontPath'' il percorso del file banco dei suoni (''soundfont bank'') di formato .SF2 per la riproduzione dei suoni con il Midi.
+
 
 +
===Scegliere il banco di suoni===
 +
E' possibile scegliere mediante la Proprietà ".SoundFontPath" della Classe ''Music'' il percorso del file banco dei suoni (''soundfont bank'') di formato .SF2 per la riproduzione dei suoni con il Midi.
 +
Music.SoundFontPath = "<FONT Color=darkgreen>''/percorso/del/soundfont/bank/file.sf2''</font>"
 +
 
 +
 
 +
===Modificare il volume===
 +
La Classe ''Music'' fornisce la Proprietà ".Volume", per modificare il volume audio dell'esecuzione.
 +
<BR>L'ambito dei valori possibili va da 0 a 128.
 +
 
 +
Esempio:
 +
Music.Volume = 110
  
  
 
===Esempio di esecuzione con un'applicazione in ambiente grafico===
 
===Esempio di esecuzione con un'applicazione in ambiente grafico===
Mostriamo un semplice esempio in applicazione grafica, nel quale si avrà anche la possibilità di arrestare, mettere in pausa l'esecuzione del file Midi e modificare il volume sonoro con uno ''Slider'':
+
Mostriamo un semplice esempio in applicazione grafica, nel quale si avrà anche la possibilità di arrestare, mettere in pausa l'esecuzione del file Midi e modificare il volume sonoro con uno ''Slider'' :
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
   
 
   
  <FONT Color=gray>' ''Se si vuole modificare il volume audio durante l'esecuzione, bisogna ricordare che il file banco dei suoni va caricato subito all'apertura del Form:''</font>
+
  <FONT Color=gray>' ''E' possibile caricare un file banco dei suoni ".sf2" a piacere:''</font>
   Music<FONT Color=#B22222>.SoundFontPath</font> = "<FONT Color=gray>''/percorso/del/soundfont/bank/file.sf2''</font>"
+
   Music<FONT Color=#B22222>.SoundFontPath</font> = "<FONT Color=darkgreen>''/percorso/del/soundfont/bank/file.sf2''</font>"
 
   
 
   
 
   With Slider1
 
   With Slider1
     .MaxValue = 128   
+
     .MaxValue = Sound.MaxVolume
 
     .Value = 100
 
     .Value = 100
 
   End With
 
   End With
 
+
 
   ValueBox1.Text = CStr(Slider1.Value)
+
   With ValueBox1
+
  .Alignment = Align.Right
'''End'''
+
  .Value = Slider1.Value
 
 
'''Public''' Sub Button1_Click()
 
 
  With Music
 
    .Load("<FONT Color=gray>''/percorso/del/file.mid''</font>")
 
    .Play
 
 
   End With
 
   End With
 +
 
 +
  ToggleButton1.Text = "Esegui"
 +
  ToggleButton2.Enabled = False
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub ToggleButton1_Click()
+
  Public Sub ToggleButton1_Click()
+
 
 +
  If ToggleButton2.Value = True Then Return
 +
 
 
   Select Case ToggleButton1.Value
 
   Select Case ToggleButton1.Value
 
     Case True
 
     Case True
       Music.Pause
+
       With Music
       ToggleButton1.Text = "Riprendi"
+
        .Load("<FONT Color=darkgreen>''/percorso/del/file.mid''</font>")
 +
        .Play
 +
      End With
 +
       ToggleButton1.Text = "Stop"
 +
      With ToggleButton2
 +
        .Enabled = True
 +
        .Text = "Pausa"
 +
      End With
 +
      Repeat
 +
        Wait 0.01
 +
        Me.Title = Str(Time(0, 0, 0, Music.Pos * 1000))
 +
      Until Music.State == Music.Stopped
 +
      Esecuzione()
 
     Case False
 
     Case False
       Music.Play
+
       Esecuzione()
      ToggleButton1.Text = "Pausa"
 
 
   End Select
 
   End Select
 +
   
 +
End
 
   
 
   
'''End'''
 
 
 
'''Public''' Sub Button2_Click()
 
 
   
 
   
 +
Private Procedure Esecuzione()
 +
 
 
   Music.Stop
 
   Music.Stop
 +
  ToggleButton1.Text = "Esegui"
 +
  ToggleButton1.Value = False
 +
  With ToggleButton2
 +
    .Value = False
 +
    .Enabled = False
 +
    .Text = Null
 +
  End With
 +
 
 +
End
 
   
 
   
'''End'''
 
 
   
 
   
 +
Public Sub ToggleButton2_Click()
 +
 
 +
  Select Case ToggleButton2.Value
 +
    Case True
 +
      Music.Pause
 +
      ToggleButton1.Text = Null
 +
      ToggleButton1.Enabled = False
 +
      ToggleButton2.Text = "Riprendi"
 +
    Case False
 +
      Music.Play
 +
      ToggleButton1.Text = "Stop"
 +
      ToggleButton1.Enabled = True
 +
      ToggleButton2.Text = "Pausa"
 +
  End Select
 +
 
 +
End
 
   
 
   
  '''Public''' Sub Slider1_Change()
+
 
 +
  Public Sub Slider1_Change()
 
   
 
   
 
   Music.Volume = Slider1.Value
 
   Music.Volume = Slider1.Value
 
+
   ValueBox1.Value = Slider1.Value
   ValueBox1.Text = CStr(Slider1.Value)
 
 
   
 
   
  '''End'''
+
  End
  
  
 
===Esempio di esecuzione con un'applicazione ''a riga di comando''===
 
===Esempio di esecuzione con un'applicazione ''a riga di comando''===
 
In quest'altro esempio viene eseguito un file Midi con un'applicazione ''a riga di comando''. Il codice consente di vedere ''continuamente'' anche il tempo trascorso dall'inizio dell'esecuzione del file Midi:
 
In quest'altro esempio viene eseguito un file Midi con un'applicazione ''a riga di comando''. Il codice consente di vedere ''continuamente'' anche il tempo trascorso dall'inizio dell'esecuzione del file Midi:
  '''Public''' Sub Main()
+
  Public Sub Main()
 +
 +
  Dim mid As String
 +
 
 +
  mid ="<FONT Color=darkgreen>''/percorso/del/file.mid''</font>"
 
   
 
   
  <FONT Color=gray>' ''Impostiamo il percorso del file del banco di suoni ".sf2" che vogliamo utilizzare:''</font>
+
  <FONT Color=gray>' ''Possiamo scegliere il file del banco di suoni ".sf2" che vogliamo utilizzare:''</font>
  Music<FONT Color=#B22222>.SoundFontPath</font> = "<FONT Color=gray>''/percorso/del/soundfont/bank/file.sf2''</font>"
+
  Music<FONT Color=#B22222>.SoundFontPath</font> = "<FONT Color=darkgreen>''/percorso/del/soundfont/bank/file.sf2''</font>"
 
    
 
    
  Music.Load("<FONT Color=gray>''/percorso/del/file.mid''</font>")
+
  Music.Load(mid)
 +
 +
  Music.Play
 
   
 
   
  Music.Play
+
<FONT Color=gray>' ''Questo ciclo consente l'esecuzione del file Midi:''</font>
   
+
  While Music.State == Music.Playing
  While Music.State = Music.Playing
 
 
  <FONT Color=gray>' ''Mostra il tempo trascorso dall'inizio dell'esecuzione:''</font>
 
  <FONT Color=gray>' ''Mostra il tempo trascorso dall'inizio dell'esecuzione:''</font>
    Write #File.Out, CStr(Date(0, 0, 0, 0, 0, 0, Music.Pos * 1000)) & "\r"
+
    Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, Music.Pos * 1000))
  Wend
+
    Wait 0.01
 
+
  Wend
  Quit
+
 
 +
  Music.Stop
 
    
 
    
  '''End'''
+
  End
 
 
  
 
In questo secondo esempio di esecuzione di un file Midi con un'applicazione ''a riga di comando'' si potrà interagire con essa inviando tramite console/Terminale istruzioni con la tastiera per fermare l'esecuzione, metterla in pausa e riprenderla,  aumentare ed abbassare il volume audio, nonché vedere il tempo trascorso in quel momento dall'inizio dell'esecuzione del file Midi. Per interagire con la tastiera si premerà il tasto previsto per l'azione desiderata, scrivendo così il carattere in basso nella console o nel Terminale (se l'applicazione è stata lanciata da Terminale), e si premerà sul tasto "Invio".
 
In questo secondo esempio di esecuzione di un file Midi con un'applicazione ''a riga di comando'' si potrà interagire con essa inviando tramite console/Terminale istruzioni con la tastiera per fermare l'esecuzione, metterla in pausa e riprenderla,  aumentare ed abbassare il volume audio, nonché vedere il tempo trascorso in quel momento dall'inizio dell'esecuzione del file Midi. Per interagire con la tastiera si premerà il tasto previsto per l'azione desiderata, scrivendo così il carattere in basso nella console o nel Terminale (se l'applicazione è stata lanciata da Terminale), e si premerà sul tasto "Invio".
  '''Public''' Sub Main()
+
  Public Sub Main()
 +
 +
  Dim mid As String
 +
 
 +
  mid ="<FONT Color=darkgreen>''/percorso/del/file.mid''</font>"
 
   
 
   
  <FONT Color=gray>' ''Impostiamo il percorso del file del banco di suoni ".sf2" che vogliamo utilizzare:''</font>
+
  <FONT Color=gray>' ''Possiamo scegliere il file del banco di suoni ".sf2" che vogliamo utilizzare:''</font>
  Music<FONT Color=#B22222>.SoundFontPath</font> = "<FONT Color=gray>''/percorso/del/soundfont/bank/file.sf2''</font>"
+
  Music<FONT Color=#B22222>.SoundFontPath</font> = "<FONT Color=darkgreen>''/percorso/del/soundfont/bank/file.sf2''</font>"
 
   
 
   
  Music.Load("<FONT Color=gray>''/percorso/del/file.mid''</font>")
+
  Music.Load(mid)
 
   
 
   
  Music.Play
+
  Music.Play
 
   
 
   
  Do
+
<FONT Color=gray>' ''Questo ciclo consente l'esecuzione del file Midi:''</font>
 +
  Repeat
 +
<FONT Color=gray>' ''Mostra nello standard output il tempo trascorso dall'inizio dell'esecuzione:''</font>
 +
    Write "\r" & Str(Time(0, 0, 0, Music.Pos * 1000))
 
  <FONT Color=gray>' ''Una brevissima attesa consente di inviare i previsti caratteri/comandi allo standard Input:''</font>
 
  <FONT Color=gray>' ''Una brevissima attesa consente di inviare i previsti caratteri/comandi allo standard Input:''</font>
    Wait 0.01
+
    Wait 0.01
  <FONT Color=gray>' ''Mostra nello standard output il tempo trascorso dall'inizio dell'esecuzione:''</font>
+
  Until Music.State == Music.Stopped
    Write #File.Out, CStr(Date(0, 0, 0, 0, 0, 0, Music.Pos * 1000)) & "\r"
+
  Loop Until Music.State = Music.Stopped
+
  <FONT Color=gray>' ''Usando l'Evento "Application_Read()", per terminare il programma è necessario l'uso dell'istruzione "Quit"''</font>
 
+
  Quit
  Quit
 
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
    
 
    
  '''Public''' Sub Application_Read()
+
  Public Sub Application_Read()
 
    
 
    
 
   Dim s As String
 
   Dim s As String
 
   
 
   
  Line Input #File.In, s
+
  Line Input #File.In, s
 +
 
 +
  Select Case s
 +
    Case "s"
 +
      Music.Stop
 +
      Print "Esecuzione fermata."
 +
    Case "p"
 +
      Music.Pause
 +
      Print "Pausa......."
 +
    Case "r"
 +
      Music.Play
 +
      Print "....continua"
 +
    Case "+"
 +
      Music.Volume += 4
 +
      Print Music.Volume
 +
    Case "-"
 +
      Music.Volume -= 4
 +
      Print Music.Volume
 +
  End Select
 
    
 
    
  Select Case s
+
  End
    Case "s"
 
      Music.Stop
 
      Print "Esecuzione fermata."
 
      Quit
 
    Case "p"
 
      Music.Pause
 
      Print "Pausa......."
 
    Case "r"
 
      Music.Play
 
      Print "....continua"
 
    Case "+"
 
      Music.Volume += 1
 
      Print Music.Volume
 
    Case "-"
 
      Music.Volume -= 1
 
      Print Music.Volume
 
  End Select
 
 
 
  '''End'''
 
  
  
===Modificare il volume===
+
===Eseguire un breve suono ripetutamente in un ciclo===
 
+
Se si dispone di un file MIDI contenente i dati per eseguire un unico Evento "Midi-ON" di brevissima durata, e si intende eseguirlo ripetutamente in un ciclo, si potrà adottare il seguente codice, nel quale si eseguiranno i dati MIDI ogni mezzo secondo:
Come già visto, la Classe ''Music'' fornisce la proprietà ''.Volume'' per modificare appunto il volume audio dell'esecuzione. L'ambito dei valori possibili va da 0 a 128.
+
Public Sub Main()
 
+
Esempio:
+
  Music.SoundFontPath = "<FONT Color=darkgreen>''/percorso/del/soundfont/bank/file.sf2''</font>"
  Music.Volume = 110
+
 
 +
  Music.Load("<FONT Color=darkgreen>''/percorso/del/file.mid''</font>")
 +
 +
  Do
 +
    Music.Play
 +
    While Music.State == Music.Playing  <FONT Color=gray>' ''Questo ciclo interno consente l'esecuzione del file Midi''</font>
 +
    Wend
 +
    Wait 0.5
 +
  Loop
 +
 +
  End

Versione attuale delle 06:22, 27 dic 2023

Le risorse della libreria SDL2 per la gestione dell'audio e del Midi sono state implementate in Gambas attraverso il Componente gb.sdl2.audio il quale può essere attivato anche indipendentemente dal Componente gb.sdl2 .

Il Componente gb.sdl2.audio fornisce per l'esecuzione dei file Midi la Classe Music.
E' possibile eseguire un solo file Midi per volta.


Scegliere il banco di suoni

E' possibile scegliere mediante la Proprietà ".SoundFontPath" della Classe Music il percorso del file banco dei suoni (soundfont bank) di formato .SF2 per la riproduzione dei suoni con il Midi.

Music.SoundFontPath = "/percorso/del/soundfont/bank/file.sf2"


Modificare il volume

La Classe Music fornisce la Proprietà ".Volume", per modificare il volume audio dell'esecuzione.
L'ambito dei valori possibili va da 0 a 128.

Esempio:

Music.Volume = 110


Esempio di esecuzione con un'applicazione in ambiente grafico

Mostriamo un semplice esempio in applicazione grafica, nel quale si avrà anche la possibilità di arrestare, mettere in pausa l'esecuzione del file Midi e modificare il volume sonoro con uno Slider :

Public Sub Form_Open()

' E' possibile caricare un file banco dei suoni ".sf2" a piacere:
 Music.SoundFontPath = "/percorso/del/soundfont/bank/file.sf2"

 With Slider1
   .MaxValue = Sound.MaxVolume
   .Value = 100
 End With
 
 With ValueBox1
  .Alignment = Align.Right
  .Value = Slider1.Value
 End With
 
 ToggleButton1.Text = "Esegui"
 ToggleButton2.Enabled = False

End


Public Sub ToggleButton1_Click()
 
 If ToggleButton2.Value = True Then Return
 
 Select Case ToggleButton1.Value
   Case True
     With Music
       .Load("/percorso/del/file.mid")
       .Play
     End With
     ToggleButton1.Text = "Stop"
     With ToggleButton2
       .Enabled = True
       .Text = "Pausa"
     End With
     Repeat 
       Wait 0.01
       Me.Title = Str(Time(0, 0, 0, Music.Pos * 1000))
     Until Music.State == Music.Stopped
     Esecuzione()
   Case False
     Esecuzione()
 End Select
   
End


Private Procedure Esecuzione()
 
 Music.Stop
 ToggleButton1.Text = "Esegui"
 ToggleButton1.Value = False
 With ToggleButton2
   .Value = False
   .Enabled = False
   .Text = Null
 End With
 
End


Public Sub ToggleButton2_Click()
 
 Select Case ToggleButton2.Value
   Case True
     Music.Pause
     ToggleButton1.Text = Null
     ToggleButton1.Enabled = False
     ToggleButton2.Text = "Riprendi"
   Case False
     Music.Play
     ToggleButton1.Text = "Stop"
     ToggleButton1.Enabled = True
     ToggleButton2.Text = "Pausa"
 End Select
 
End

 
Public Sub Slider1_Change()

 Music.Volume = Slider1.Value
 ValueBox1.Value = Slider1.Value

End


Esempio di esecuzione con un'applicazione a riga di comando

In quest'altro esempio viene eseguito un file Midi con un'applicazione a riga di comando. Il codice consente di vedere continuamente anche il tempo trascorso dall'inizio dell'esecuzione del file Midi:

Public Sub Main()

 Dim mid As String
 
 mid ="/percorso/del/file.mid"

' Possiamo scegliere il file del banco di suoni ".sf2" che vogliamo utilizzare:
 Music.SoundFontPath = "/percorso/del/soundfont/bank/file.sf2"
 
 Music.Load(mid)

 Music.Play

' Questo ciclo consente l'esecuzione del file Midi:
 While Music.State == Music.Playing
' Mostra il tempo trascorso dall'inizio dell'esecuzione:
   Write "\r\e[0mTempo trascorso: \e[31m" & Str(Time(0, 0, 0, Music.Pos * 1000))
   Wait 0.01
 Wend
 
 Music.Stop
  
End

In questo secondo esempio di esecuzione di un file Midi con un'applicazione a riga di comando si potrà interagire con essa inviando tramite console/Terminale istruzioni con la tastiera per fermare l'esecuzione, metterla in pausa e riprenderla, aumentare ed abbassare il volume audio, nonché vedere il tempo trascorso in quel momento dall'inizio dell'esecuzione del file Midi. Per interagire con la tastiera si premerà il tasto previsto per l'azione desiderata, scrivendo così il carattere in basso nella console o nel Terminale (se l'applicazione è stata lanciata da Terminale), e si premerà sul tasto "Invio".

Public Sub Main()

 Dim mid As String
 
 mid ="/percorso/del/file.mid"

' Possiamo scegliere il file del banco di suoni ".sf2" che vogliamo utilizzare:
 Music.SoundFontPath = "/percorso/del/soundfont/bank/file.sf2"

 Music.Load(mid)

 Music.Play

' Questo ciclo consente l'esecuzione del file Midi:
 Repeat
' Mostra nello standard output il tempo trascorso dall'inizio dell'esecuzione:
   Write "\r" & Str(Time(0, 0, 0, Music.Pos * 1000))
' Una brevissima attesa consente di inviare i previsti caratteri/comandi allo standard Input:
   Wait 0.01
 Until Music.State == Music.Stopped

' Usando l'Evento "Application_Read()", per terminare il programma è necessario l'uso dell'istruzione "Quit"
 Quit

End

 
Public Sub Application_Read()
  
 Dim s As String

 Line Input #File.In, s
 
 Select Case s
   Case "s"
     Music.Stop
     Print "Esecuzione fermata."
   Case "p"
     Music.Pause
     Print "Pausa......."
   Case "r"
     Music.Play
     Print "....continua"
   Case "+"
     Music.Volume += 4
     Print Music.Volume
   Case "-"
     Music.Volume -= 4
     Print Music.Volume
 End Select
 
End


Eseguire un breve suono ripetutamente in un ciclo

Se si dispone di un file MIDI contenente i dati per eseguire un unico Evento "Midi-ON" di brevissima durata, e si intende eseguirlo ripetutamente in un ciclo, si potrà adottare il seguente codice, nel quale si eseguiranno i dati MIDI ogni mezzo secondo:

Public Sub Main()

 Music.SoundFontPath = "/percorso/del/soundfont/bank/file.sf2"
 
 Music.Load("/percorso/del/file.mid")

 Do
   Music.Play
   While Music.State == Music.Playing  ' Questo ciclo interno consente l'esecuzione del file Midi
   Wend
   Wait 0.5
 Loop

End