La gestione dei file MIDI mediante le funzioni esterne del API di Rhythmbox
Da Gambas-it.org - Wikipedia.
Versione del 11 ago 2019 alle 16:44 di Vuott (Discussione | contributi)
Rythmbox è una libreria del progetto GNOME capace di gestire ed eseguire (oltre a vari formati audio) i file MIDI.
Va utilizzata congiuntamente con alcune funzioni esterne della libreria di GStreamer. Pertanto sarà necessario avere intallate nel sistema e richiamare in Gambas le librerie dinamiche condivise: "librhythmbox-core.so.10.0.0" e "libgstreamer-1.0.so"
Mostriamo un semplice esempio pratico, in cui si eseguirà un file Midi:
Library "librhythmbox-core:10.0.0" Private Enum RB_PLAYER_PLAY_REPLACE = 0, RB_PLAYER_PLAY_AFTER_EOS, RB_PLAYER_PLAY_CROSSFADE ' RBPlayer * rb_player_new (gboolean want_crossfade, GError **error) ' Creates a new player object. Private Extern rb_player_new(want_crossfade As Boolean, gerror As Pointer) As Pointer ' gboolean rb_player_open (RBPlayer *player, const char *uri, gpointer stream_data, GDestroyNotify stream_data_destroy, GError **error) ' Prepares a stream for playback. Private Extern rb_player_open(player As Pointer, uri As String, stream_data As Pointer, stream_data_destroy As Pointer, gerror As Pointer) As Boolean ' gboolean rb_player_play (RBPlayer *player, RBPlayerPlayType play_type, gint64 crossfade, GError **error) ' Starts playback of the most recently opened stream. Private Extern rb_player_play(player As Pointer, play_type As Integer, crossfade As Long, gerror As Pointer) As Boolean ' gint64 rb_player_get_time (RBPlayer *player) ' Returns the current playback for the current stream in nanoseconds. Private Extern rb_player_get_time(player As Pointer) As Long Library "libgstreamer-1.0" ' gst_init (int *argc, char **argv[]) ' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins. Private Extern gst_init(argc As Pointer, argv As Pointer) ' gchar * g_filename_to_uri (const gchar *filename, const gchar *hostname, GError **error) ' Converts an absolute filename to an escaped ASCII-encoded URI. Private Extern g_filename_to_uri(filename As String, hostname As String, GError As Pointer) As String Public Sub Main() Dim pl As Pointer Dim bo As Boolean Dim c, tm As Long gst_init(0, 0) pl = rb_player_new(False, 0) If pl = 0 Then Error.Raise("ERRORE !") bo = rb_player_open(pl, g_filename_to_uri("/percorso/del/file.mid", Null, 0), 0, 0, 0) If Not bo Then Error.Raise("ERRORE !") bo = rb_player_play(pl, RB_PLAYER_PLAY_AFTER_EOS, 0, 0) If Not bo Then Error.Raise("ERRORE !") ' Si imposta la variabile "c" a -20 rispetto all'attesa di 1/10 di secondo per non far arrestare il ciclo prima del termine del file: c = -20 Repeat ' La variabile "c" sarà incrementata ogni 1/10 di secondo: Inc c Sleep 0.1 tm = rb_player_get_time(pl) Write #File.out, "\rTempo trascorso: " & Str(Date(0, 0, 0, 0, 0, 0, tm / 1000000)) Flush #File.Out ' La variabile "c" rispetto a "tm" porta un leggero ritardo, che sarà colmato quando la funzione "rb_player_get_time()" ' terminerà di restituire il valore di ritorno alla fine dell'esecuzione del file Midi: Until (c * 100000000) > tm End