Differenze tra le versioni di "Alsa e Gambas: Il Tempo della coda"

Da Gambas-it.org - Wikipedia.
(Redirect alla pagina ALSA e Gambas - Il Tempo della coda)
 
(41 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
ALSA dispone di varie funzioni per poter gestire il Tempo di un brano musicale, ossia la velocità di una coda di eventi.
+
#REDIRECT [[ALSA_e_Gambas_-_Il_Tempo_della_coda]]
<BR>Il Tempo pianificato degli eventi può essere definito in:
 
* ''Tempo reale'' (evento di tempo Midi: SND_SEQ_EVENT_TEMPO), che determina il tempo in microsecondi;
 
* ''Tick'' (PPQ - pulse per quarter note) che determina il Tempo per ''tick''.
 
 
 
<p>L'impostazione del Tempo in ''Tick'' (PPQ) definisce la risoluzione dei tick. Esso è impostato di default a 96 tick per quarto; ossia per ogni quarto (corrispondente al valore temporale in musica di una semiminima) vi sono 96 tick. Inoltre, ALSA imposta di default il valore dei movimenti per minuto (bpm - beat per minute) a 120, che è pari a 50.000 microsecondi (= 60 * 1000000 / 120).</p>
 
<P>Il Tempo viene gestito in microsecondi per tick mediante la funzione di ALSA ''snd_seq_queue_tempo_set_tempo()''; mentre la funzione ''snd_seq_queue_tempo_set_ppq()'' imposta i tick per quarti. Solitamente, si preferisce impostare il Tempo in movimenti per minuto (bpm - beat per minute). Così, la prima funzione, sopra indicata, calcola il tempo preciso, la seconda contiene i valori per gestire il tempo sulla base dei movimenti per minuto .</p>
 
<P>Da notare che l'impostazione in PPQ non può essere modificata mentre la coda sta scorrendo, pertanto quel parametro deve essere impostato prima della partenza della coda. Per modificare, invece, il tempo della coda, mentre sta scorrendo, si dovrà operare mediante la funzione di ALSA ''snd_seq_set_queue_tempo()'' oppure inviare un evento di tempo Midi: SND_SEQ_EVENT_TEMPO.</p>
 
 
 
Nel caso la coda sia stata impostata in ''real-time'', allora la risoluzione, come sappiamo, è definita in nanosecondi.
 
 
 
 
 
====La scrittura del codice in Gambas====
 
 
 
Nel nostro applicativo in Gambas procederemo con la necessaria scrittura del codice per la variazione del Tempo come segue.
 
Potremo innanzitutto inserire uno Slider nella classe principale FMain.class, con il quale variare il valore del tempo desiderato, e che richiama nella classe CAlsa.class la seguente routine:
 
 
 
PRIVATE EXTERN snd_seq_queue_tempo_malloc(queue_tempo As Pointer) As Integer
 
PRIVATE EXTERN snd_seq_queue_tempo_set_tempo(qtempo As Pointer, quarti_per_minuto As Integer) As Integer
 
PRIVATE EXTERN snd_seq_set_queue_tempo(seq As Pointer, outq As Integer, qtempo As Pointer) As Integer
 
PRIVATE EXTERN snd_seq_queue_tempo_free(qtempo As Pointer) As Integer
 
 
'''Public''' Sub impostaTempo(quarti_per_minuto As Integer)
 
Dim qtempo As Pointer
 
 
snd_seq_queue_tempo_malloc(varPtr(qtempo))
 
 
<Font Color= #006400>' ''snd_seq_queue_tempo_set_ppq(queue_tempo, tpq)''</font>
 
quarti_per_minuto = CInt(6000000000 / (quarti_per_minuto * 96))
 
 
  snd_seq_queue_tempo_set_tempo(qtempo, quarti_per_minuto)
 
 
    snd_seq_set_queue_tempo(handle, outq, qtempo)
 
 
    snd_seq_queue_tempo_free(qtempo)
 
 
  '''End'''
 
 
 
La funzione di ALSA ''snd_seq_queue_tempo_malloc(snd_seq_queue_tempo_t ** ptr)'' riserva della memoria per la gestione del tempo da parte delle funzioni di ALSA, e ritorna un puntatore. In questo caso ALSA riserva la memoria necessaria per la funzione, e ritorna un puntatore (segnato dal secondo dei due asterischi). Il primo asterisco è necessario perché ALSA deve sapere dove scrivere il suo puntatore per passarlo poi all'applicativo. Quindi avremo un puntatore ad un puntatore. Infatti, ogni volta che una funzione C scrive qualcosa, è necessario passargli un puntatore. Se ALSA deve riempire un puntatore, bisognerà passarle un puntatore a questo puntatore. Per passare, dunque, un indirizzo del puntatore (cioè ''un puntatore ad un puntatore'') ad ALSA, useremo la funzione di Gambas ''VarPtr''.
 
<P>La funzione ''int snd_seq_set_queue_tempo(snd_seq_t * seq, int q, snd_seq_queue_tempo_t * tempo)'' imposta il tempo di una coda. Laddove:
 
* ''seq'' è l'handle del sequencer ALSA;
 
* ''q'' è è il numero identificativo della coda, di cui si deve cambiare il tempo;
 
* ''tempo'' è un puntatore ed un'informazione relativa al tempo.</p>
 
<P>La funzione ''snd_seq_queue_tempo_free(snd_seq_queue_tempo_t * obj)'' libera l'area di memoria precedentemente allocata.</p>
 
 
 
Anche per la modifica del Tempo sarà necessario il passaggio finale attraverso la funzione esterna, che già conosciamo, '' snd_seq_drain_output()''.
 

Versione attuale delle 17:37, 12 gen 2022