Differenze tra le versioni di "La gestione dei file MIDI mediante le funzioni esterne del API di SDL 2"

Da Gambas-it.org - Wikipedia.
 
(14 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
La libreria '''''SDL 2''''' è un [http://it.wikipedia.org/wiki/Application_programming_interface API] multi-piattaforma contenente funzioni per la gestione multimediale dell'audio e del video.
+
La libreria '''SDL2''' è un [http://it.wikipedia.org/wiki/Application_programming_interface API] multi-piattaforma contenente funzioni per la gestione multimediale dell'audio e del video.
  
  
Per poter utilizzare le funzioni esterne di ''SDL 2'' in Gambas, si richiameranno anche separatamente per lo più le seguenti librerie (con le attuali versioni):
+
Per poter utilizzare le funzioni esterne di ''SDL2'' in Gambas, si richiameranno anche separatamente per lo più le seguenti librerie esterne:
* ''libSDL2-2.0.so.0.2.0''
+
* ''libSDL2-2.0.so.0.2800.5''
* ''libSDL2_mixer-2.0.so.0.0.0''
+
* ''libSDL2_mixer-2.0.so.0.600.3''
  
Inoltre, per l'ascolto dei file Midi, sarà necessario impostare il file banco di suoni .sf2 nell'apposita funzione ''Mix_SetSoundFonts()''.
+
Inoltre, per l'ascolto dei file Midi, si potrà - volendo - impostare un file banco di suoni .sf2 nell'apposita funzione ''Mix_SetSoundFonts()''.
  
  
 
Mostriamo un semplice esempio per eseguire un file Midi:
 
Mostriamo un semplice esempio per eseguire un file Midi:
  Library "libSDL2-2.0:0.2.0"
+
  Library "<FONT Color=blue>libSDL2-2.0:0.2800.5</font>"
 
   
 
   
 
  Private Const SDL_INIT_AUDIO As Integer = 16
 
  Private Const SDL_INIT_AUDIO As Integer = 16
Riga 28: Riga 28:
 
   
 
   
 
   
 
   
  Library "libSDL2_mixer-2.0:0.0.0"
+
  Library "<FONT Color=red>libSDL2_mixer-2.0:0.600.3</font>"
 
   
 
   
  Private Const MIX_DEFAULT_FREQUENCY As Integer = 22050
+
  Private Const MIX_DEFAULT_FREQUENCY As Integer = 44100
 
   
 
   
 
  <FONT Color=gray>' ''int Mix_SetSoundFonts(const char *paths)''
 
  <FONT Color=gray>' ''int Mix_SetSoundFonts(const char *paths)''
Riga 51: Riga 51:
 
  ' ''Play an audio chunk on a specific channel.''</font>
 
  ' ''Play an audio chunk on a specific channel.''</font>
 
  Private Extern Mix_PlayMusic(music As Pointer, loops As Integer) As Integer
 
  Private Extern Mix_PlayMusic(music As Pointer, loops As Integer) As Integer
 +
 +
<FONT Color=gray>' ''int Mix_VolumeMusic(int volume)''
 +
' ''Set the volume in the range of 0-128.''</font>
 +
Private Extern Mix_VolumeMusic(volume As Integer) As Integer
 
   
 
   
 
  <FONT Color=gray>' ''int Mix_PlayingMusic()''
 
  <FONT Color=gray>' ''int Mix_PlayingMusic()''
Riga 56: Riga 60:
 
  Private Extern Mix_PlayingMusic() As Integer
 
  Private Extern Mix_PlayingMusic() As Integer
 
   
 
   
  <FONT Color=gray>' ''void Mix_FreeChunk(Mix_Chunk *chunk)''
+
  <FONT Color=gray>' ''void Mix_FreeMusic(Mix_Music *music)''
 
  ' ''Free an audio chunk previously loaded.''</font>
 
  ' ''Free an audio chunk previously loaded.''</font>
  Private Extern Mix_FreeChunk(chunk As Pointer)
+
  Private Extern Mix_FreeMusic(music As Pointer)
 
   
 
   
 
  <FONT Color=gray>' ''void Mix_CloseAudio(void)''
 
  <FONT Color=gray>' ''void Mix_CloseAudio(void)''
Riga 65: Riga 69:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   Dim err As Integer
 
   Dim err As Integer
Riga 78: Riga 82:
 
   
 
   
 
  <FONT Color=gray>' ''Inizializza la libreria SDL 2:''</font>
 
  <FONT Color=gray>' ''Inizializza la libreria SDL 2:''</font>
    err = SDL_Init(SDL_INIT_AUDIO)
+
  err = SDL_Init(SDL_INIT_AUDIO)
    If err < 0 Then Error.Raise("Impossibile inizializzare la libreria SDL2: " & SDL_GetError())
+
  If err < 0 Then Error.Raise("Impossibile inizializzare la libreria SDL2: " & SDL_GetError())
 
   
 
   
  <FONT Color=gray>' ''Imposta il banco di suoni per l'esecuzione del Midi:''</font>
+
  <FONT Color=gray>' ''Volendo, si può impostare il banco di suoni per l'esecuzione del Midi:''</font>
    Mix_SetSoundFonts("''/percorso/del/file/soundbank.sf2''")
+
  Mix_SetSoundFonts("<FONT Color=darkgreen>''/percorso/del/file/soundbank.sf2''</font>")
 
      
 
      
 
  <FONT Color=gray>' ''Apre il dispositivo audio:''</font>
 
  <FONT Color=gray>' ''Apre il dispositivo audio:''</font>
    If Mix_OpenAudio(audio_rate, audio_format, audio_channels, 4096) < 0 Then
+
  If Mix_OpenAudio(audio_rate, audio_format, audio_channels, 4096) < 0 Then
      Error.Raise("Impossibile aprire il dispositivo audio: " & SDL_GetError())
+
    Error.Raise("Impossibile aprire il dispositivo audio: " & SDL_GetError())
    Else
+
  Else
      Mix_QuerySpec(VarPtr(audio_rate), VarPtr(audio_format), VarPtr(audio_channels))
+
    Mix_QuerySpec(VarPtr(audio_rate), VarPtr(audio_format), VarPtr(audio_channels))
     Endif
+
  Endif
     If audio_channels > 2 Then
+
  If audio_channels > 2 Then
       canali = "surround"
+
     canali = "surround"
 +
  Else
 +
     If audio_channels > 1 Then
 +
       canali = "stereo"
 
     Else
 
     Else
       If audio_channels > 1 Then
+
       canali = "mono"
        canali = "stereo"
 
      Else
 
        canali = "mono"
 
      Endif
 
 
     Endif
 
     Endif
    Print "Audio aperto a "; audio_rate; " Hz, "; audio_format And 255; " bit, "; canali
+
  Endif
 +
  Print "Audio aperto a "; audio_rate; " Hz, "; audio_format And 255; " bit, "; canali
 
   
 
   
 
  <FONT Color=gray>' ''Carica il file Midi:''</font>
 
  <FONT Color=gray>' ''Carica il file Midi:''</font>
  music = Mix_LoadMUS("''/percorso/del/file.mid''")
+
  music = Mix_LoadMUS("<FONT Color=darkgreen>''/percorso/del/file.mid''</font>")
  If IsNull(music) Then Error.Raise("Impossibile caricare il file Midi: " & SDL_GetError())
+
  If music == 0 Then Error.Raise("Impossibile caricare il file Midi: " & SDL_GetError())
 +
 
 +
<FONT Color=gray>' ''Imposta il volume di esecuzione (da 0 a 128):''</font>
 +
  Mix_VolumeMusic(40)
 
    
 
    
 
  <FONT Color=gray>' ''Esegue il file Midi. Se il secondo argomento è posto a 0 il file sarà eseguito soltanto una volta.''
 
  <FONT Color=gray>' ''Esegue il file Midi. Se il secondo argomento è posto a 0 il file sarà eseguito soltanto una volta.''
 
  ' ''Se è posto a -1 il file sarà esguito all'infinito:''</font>
 
  ' ''Se è posto a -1 il file sarà esguito all'infinito:''</font>
  err = Mix_PlayMusic(music, 0)
+
  err = Mix_PlayMusic(music, 0)
  If err < 0 Then Error.Raise("Impossibile eseguire il file Midi: " & SDL_GetError())
+
  If err < 0 Then Error.Raise("Impossibile eseguire il file Midi: " & SDL_GetError())
 
    
 
    
  tempus = Now
+
  tempus = Now
 
    
 
    
  While Mix_PlayingMusic() <> 0
+
  While Mix_PlayingMusic() <> 0
 
  <FONT Color=gray>' ''Mostra il tempo trascorso dall'inizio dell'esecuzione del file Midi:''</font>
 
  <FONT Color=gray>' ''Mostra il tempo trascorso dall'inizio dell'esecuzione del file Midi:''</font>
    Write #File.Out, CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(tempus, Now, gb.Millisecond))) & "\r"
+
    Write "\r" & Str(Time(0, 0, 0, DateDiff(tempus, Now, gb.Millisecond)))
  Wend
+
    Wait 0.01
+
  Wend
 
    
 
    
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
 
  <FONT Color=gray>' ''Va in chiusura:''</font>
  Mix_FreeChunk(music)
+
  Mix_FreeMusic(music)
  Mix_CloseAudio()
+
  Mix_CloseAudio()
  SDL_Quit()
+
  SDL_Quit()
 
   
 
   
  '''End'''
+
  End
 
 
  
  

Versione attuale delle 18:37, 26 dic 2023

La libreria SDL2 è un API multi-piattaforma contenente funzioni per la gestione multimediale dell'audio e del video.


Per poter utilizzare le funzioni esterne di SDL2 in Gambas, si richiameranno anche separatamente per lo più le seguenti librerie esterne:

  • libSDL2-2.0.so.0.2800.5
  • libSDL2_mixer-2.0.so.0.600.3

Inoltre, per l'ascolto dei file Midi, si potrà - volendo - impostare un file banco di suoni .sf2 nell'apposita funzione Mix_SetSoundFonts().


Mostriamo un semplice esempio per eseguire un file Midi:

Library "libSDL2-2.0:0.2800.5"

Private Const SDL_INIT_AUDIO As Integer = 16
Private Const MIX_DEFAULT_FORMAT As Integer = 32784

' int SDL_Init(Uint32 flags)
' Initialize the SDL library.
Private Extern SDL_Init(flags As Integer) As Integer

' const char* SDL_GetError(void)
' Retrieve a message about the last error that occurred.
Private Extern SDL_GetError() As String

' void SDL_Quit(void)
' Clean up all initialized subsystems.
Private Extern SDL_Quit()


Library "libSDL2_mixer-2.0:0.600.3"

Private Const MIX_DEFAULT_FREQUENCY As Integer = 44100

' int Mix_SetSoundFonts(const char *paths)
' Set SoundFonts paths to use by supported MIDI backends.
Private Extern Mix_SetSoundFonts(paths As String) As Integer
 
' int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)
' Initialize the mixer API.
Private Extern Mix_OpenAudio(frequency As Integer, format16 As Short, channels As Integer, chunksize As Integer) As Integer

' int Mix_QuerySpec(int *frequency, Uint16 *format, int *channels)
' Get the actual audio format in use by the opened audio device.
Private Extern Mix_QuerySpec(frequencyP As Pointer, formatP As Pointer, channelsP As Pointer) As Integer

' Mix_Music * Mix_LoadMUS(const char *file)
' Load a wave file or a music.
Private Extern Mix_LoadMUS(file As String) As Pointer

' int Mix_PlayMusic(Mix_Music *music, int loops)
' Play an audio chunk on a specific channel.
Private Extern Mix_PlayMusic(music As Pointer, loops As Integer) As Integer

' int Mix_VolumeMusic(int volume)
' Set the volume in the range of 0-128.
Private Extern Mix_VolumeMusic(volume As Integer) As Integer

' int Mix_PlayingMusic()
' Check the status of a specific channel.
Private Extern Mix_PlayingMusic() As Integer

' void Mix_FreeMusic(Mix_Music *music)
' Free an audio chunk previously loaded.
Private Extern Mix_FreeMusic(music As Pointer)

' void Mix_CloseAudio(void)
' Close the mixer, halting all playing audio.
Private Extern Mix_CloseAudio()


Public Sub Main()

 Dim err As Integer
 Dim canali As String
 Dim music As Pointer
 Dim tempus As date
' Vengono impostati i valori predefiniti iniziali della frequenza, del formato e del numero dei canali dell'audio:
' E' possibile modificare tali valori:
 Dim audio_rate As Integer = MIX_DEFAULT_FREQUENCY
 Dim audio_format As Short = MIX_DEFAULT_FORMAT
 Dim audio_channels As Integer = 2

' Inizializza la libreria SDL 2:
 err = SDL_Init(SDL_INIT_AUDIO)
 If err < 0 Then Error.Raise("Impossibile inizializzare la libreria SDL2: " & SDL_GetError())

' Volendo, si può impostare il banco di suoni per l'esecuzione del Midi:
 Mix_SetSoundFonts("/percorso/del/file/soundbank.sf2")
   
' Apre il dispositivo audio:
 If Mix_OpenAudio(audio_rate, audio_format, audio_channels, 4096) < 0 Then
   Error.Raise("Impossibile aprire il dispositivo audio: " & SDL_GetError())
 Else
   Mix_QuerySpec(VarPtr(audio_rate), VarPtr(audio_format), VarPtr(audio_channels))
 Endif
 If audio_channels > 2 Then
   canali = "surround"
 Else
   If audio_channels > 1 Then
     canali = "stereo"
   Else
     canali = "mono"
   Endif
 Endif
 Print "Audio aperto a "; audio_rate; " Hz, "; audio_format And 255; " bit, "; canali

' Carica il file Midi:
 music = Mix_LoadMUS("/percorso/del/file.mid")
 If music == 0 Then Error.Raise("Impossibile caricare il file Midi: " & SDL_GetError())
  
' Imposta il volume di esecuzione (da 0 a 128):
 Mix_VolumeMusic(40)
  
' Esegue il file Midi. Se il secondo argomento è posto a 0 il file sarà eseguito soltanto una volta.
' Se è posto a -1 il file sarà esguito all'infinito:
 err = Mix_PlayMusic(music, 0)
 If err < 0 Then Error.Raise("Impossibile eseguire il file Midi: " & SDL_GetError())
  
 tempus = Now
  
 While Mix_PlayingMusic() <> 0
' Mostra il tempo trascorso dall'inizio dell'esecuzione del file Midi:
   Write "\r" & Str(Time(0, 0, 0, DateDiff(tempus, Now, gb.Millisecond)))
   Wait 0.01
 Wend
  
' Va in chiusura:
 Mix_FreeMusic(music)
 Mix_CloseAudio()
 SDL_Quit()

End


Riferimenti