Autore Topic: GAMBAS e MIDI. E' proprio un mistero ?  (Letto 3863 volte)

vuott

  • Visitatore
GAMBAS e MIDI. E' proprio un mistero ?
« il: 18 Maggio 2010, 23:54:31 »
Salve,

vorrei scrivere un programma per la lettura e per le gestione dei dati MIDI. Suppongo che la migliore cosa da fare sia far comunicare il mio futuro programma con la scheda audio mediante l'interfaccia "universale" Timidity.

Come faccio ad inviare i dati MIDI a Timidity ? Di quali istruzioni e funzioni ho bisogno ?

Grazie.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #1 il: 19 Maggio 2010, 12:31:03 »
credo che la cosa migliore sia studiarsi a fondo il funzionamento di timidy, se è utilizzabile tramite comandi da terminale puoi sicuramente comandarlo con comandi shell, in alternativa dovresti trattarlo come una libreria e comandarlo tramite puntatore a funzioni esterne (metodo molto poco conoscuto da me :) )

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #2 il: 19 Maggio 2010, 15:02:38 »
Salve,

vorrei scrivere un programma per la lettura e per le gestione dei dati MIDI. Suppongo che la migliore cosa da fare sia far comunicare il mio futuro programma con la scheda audio mediante l'interfaccia "universale" Timidity.

Come faccio ad inviare i dati MIDI a Timidity ? Di quali istruzioni e funzioni ho bisogno ?

Grazie.

Non ho mai provato ma potresti cercare di vedere se gambas legge i midi con la libreria sound..

vuott

  • Visitatore
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #3 il: 20 Maggio 2010, 11:26:57 »
Innanzitutto, vorrei ringraziare i 2 colleghi del forum che hanno risposto.

Vorrei, inoltre, domandare a " fsurfing " (e comunque a chiunque possa darmi aiuto), riguardo al suo suggerimento dell'uso di comandi con Shell, se può essere utile al mio caso l'esempio seguente:

<<    SHELL "fluidsynth --connect-jack-outputs --no-shell --verbose --server
--audio-driver=jack --midi-channels=1 --portname=LiquidSynth01
-oshell.port=9800 -oaudio.jack.id=LiquidSynth01 -omidi.driver=alsa_seq
-omidi.portname=LiquidSynth01 -omidi.alsa_seq.id=LiquidSynth01"
          >>

che ho trovato sul seguente sito:
http://www.mail-archive.com/gambas-user@lists.sourceforge.net/msg03891.html

L'autore del progetto usa, inoltre, fuidsinth come demone d'interfaccia (io avevo pensato a timidity).

Che dite ?
« Ultima modifica: 20 Maggio 2010, 11:28:55 da vuott »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #4 il: 20 Maggio 2010, 12:24:28 »
ti posso solo consigliare una cosa: prova e sbattici la testa finchè non si rompe! :P, naturalmente chiedi pure su singoli quesiti.
credo che comunque l' approccio dell' utente dovrebbe essere valido, prova anche invece di utilizzare un soket a utilizzare un semplice processo, nel forum ci sono degli esempi di utilizzo di process, questo metodo cmq funziona bene se il progrmma che lanci con shell ha un output che puoi analizzare per poter gestire eventuali errori o altro

vuott

  • Visitatore
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #5 il: 23 Maggio 2010, 23:38:38 »
Dunque, sono riuscito a richiamare Timidity con il comando Shell, ma mi sono reso conto che è lui il sequencer, e che pertanto io non avevo creato proprio niente. All'inizio avevo pensato a Timidity come demone per la sua universalità.

Ad ogni modo ho cercato un'alternativa per la realizzazione del lettore/gestore di dati Midi, e m'è venuto in mente ALSA. Dando un'occhiata nel sito di ALSA( http://www.alsa-project.org/main/index.php/Main_Page ) ho trovato effettivamente molte informazioni, e mi pare che possa essere utile al caso mio.
Lì si fa riferimento alle API di ALSA: << The ALSA library API is the interface to the ALSA drivers. Developers need to use the functions in this API to achieve native ALSA support for their applications. The ALSA lib documentation is a valuable developer reference to the available functions. >>.
http://www.alsa-project.org/main/index.php/ALSA_Library_API
http://www.alsa-project.org/alsa-doc/alsa-lib/
http://www.alsa-project.org/main/index.php/Tutorials_and_Presentations


La nuova domanda é: e' possibile richiamare le API di ALSA con GAMBAS ? Se sì, con quale istruzione ?
Grazie
« Ultima modifica: 23 Maggio 2010, 23:40:35 da vuott »

Offline Mario

  • Grande Gambero
  • ***
  • Post: 138
    • Mostra profilo
    • http://overhill1963.blogspot.com/
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #6 il: 24 Maggio 2010, 09:21:18 »
Ciao Paolo,
scusa se ti rispondo qui sul forum, ma ho problemi con la mia posta elettronica (la storia del ciabattino con le scarpe rotte, hai presente?  ;D)

Da quello che ho capito sul tuo messaggio
Citazione
Event Queues-
-Creation of a queue-
Creating a queue is done usually by calling snd_seq_alloc_queue. You can create a queue with a certain name by snd_seq_alloc_named_queue(), too.

// create a queue and return its id
int my_queue(snd_seq_t *handle)
{
        return snd_seq_alloc_named_queue(handle, "my queue");
}

These functions are the wrapper to the function snd_seq_create_queue(). For releasing the allocated queue, call snd_seq_free_queue() with the obtained queue id.

Once when a queue is created, the two queues are associated to that queue record in fact: one is the realtime queue and another is the tick queue. These two queues are bound together to work synchronously. Hence, when you schedule an event, you have to choose which queue type is used as described in the section Time stamp.

Setting queue tempo
The tempo (or the speed) of the scheduling queue is variable. In the case of tick queue, the tempo is controlled in the manner of MIDI. There are two parameters to define the actual tempo, PPQ (pulse per quarter note) and MIDI tempo. The former defines the base resolution of the ticks, while the latter defines the beat tempo in microseconds. As default, 96 PPQ and 120 BPM are used, respectively. That is, the tempo is set to 500000 (= 60 * 1000000 / 120). Note that PPQ cannot be changed while the queue is running. It must be set before the queue is started.

On the other hand, in the case of realtime queue, the time resolution is fixed to nanoseconds. There is, however, a parameter to change the speed of this queue, called skew. You can make the queue faster or slower by setting the skew value bigger or smaller. In the API, the skew is defined by two values, the skew base and the skew value. The actual skew is the fraction of them, value/base. As default, the skew base is set to 16bit (0x10000) and the skew value is the identical, so that the queue is processed as well as in the real world.

When the tempo of realtime queue is changed, the tempo of the associated tick queue is changed together, too. That's the reason why two queues are created always. This feature can be used to synchronize the event queue with the external synchronization source like SMPTE. In such a case, the realtime queue is skewed to match with the external source, so that both the realtime timestamp and the MIDI timestamp are synchronized.

For setting these tempo parameters, use snd_seq_queue_tempo_t record. For example, to set the tempo of the queue q to 48 PPQ, 60 BPM,
i dati all'apparato MIDI vengono inviati creando una specie di collegamento, quindi si crea la sequenza di dati che si desidera inviare al device, poi si crea questo collegamento, e le funzioni API pensano a inviare i  dati nel momento giusto...  ma forse ho capito male io :)
Come ti dicevo ho lasciato perdere la questione da un po' di tempo (ringraziando il cielo il lavoro è tornato a riempirmi le giornate :D)

Ma se trovo qualcosa in giro, intervengo subito! :D
Saluti a tutti

Mario

vuott

  • Visitatore
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #7 il: 24 Maggio 2010, 13:03:45 »
Ciao Mario,
grazie ancora per la tua disponibilità.

Vorrei sottoporre a te ed agli altri amici del forum questa risposta ad analoga domanda circa la possibilità di richiamare le API di ALSA con Gambas:

<< Not directly, but you can use EXTERN to call functions directly in the ALSA library.
But why do you need ALSA to write a midi sequencer? Can't you just use the midi port device file?
Benoît Minisini
>>

Letta la risposta di Minisini mi/vi domando:

1) ma allora basta inviare i valori a /dev/midi per far suonare il midi?

2) ad esempio sotto /dev vedo una porta di nome "sequencer"... è questo il nome della porta che mi interessa ?
« Ultima modifica: 24 Maggio 2010, 13:07:13 da vuott »

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #8 il: 24 Maggio 2010, 14:55:46 »
1) ma allora basta inviare i valori a /dev/midi per far suonare il midi?

2) ad esempio sotto /dev vedo una porta di nome "sequencer"... è questo il nome della porta che mi interessa ?

Devi provare.....purtroppo non sappiamo risolvere il problema preciso in questione poichè possiamo aiutarti con il linguaggio ma non con tutti gli usi che se ne possono fare.....tu prova e poi torna per risolvere eventuali errori..

vuott

  • Visitatore
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #9 il: 24 Maggio 2010, 19:22:20 »
...le informazioni in giro ci sarebbero pure:

Introduction to MIDI programming in Linux
https://ccrma.stanford.edu/~craig/articles/linuxmidi/

...e chissà quanto altro,

ma gli esempi sono solo in C !!!   ???

Come li adatto o recupero con Gambas ?
« Ultima modifica: 10 Agosto 2020, 20:18:33 da vuott »

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #10 il: 25 Maggio 2010, 00:02:12 »
Mi pare che Benoit sia stato chiaro...devi usare extern....qui nessuno lo hai mai fatto poichè non se ne sente il bisogno quindi non possiamo aiutarti moltissimo.....

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.484
    • Mostra profilo
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #11 il: 25 Maggio 2010, 12:47:49 »
come già detto in un altro post esiste un esempio dell' utilizzo di extern realizzato da un vecchio utente , usa la ricerca per trovare il post e li allegato cè il programma di esempio

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
GAMBAS e MIDI: Invio dati per far suonare e far cessare una nota
« Risposta #12 il: 05 Giugno 2010, 13:57:58 »
Dunque, dopo qualche ricerca e con i preziosi suggerimenti e consigli dell'amico Doriano e di mio fratello Roberto, sono riuscito a far suonare una nota midi !
« Ultima modifica: 28 Giugno 2010, 13:52:25 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: GAMBAS e MIDI. E' proprio un mistero ?
« Risposta #13 il: 05 Giugno 2010, 15:01:16 »
Ho editato il tuo messaggio affinchè il codice appaia meno "testuale"...ricorda la prossima volta di racchiudere il codice negli appositi tag oppure usando il tasto con il simbolo #
;)

Comunque complimenti....ora continua almeno per inserire la seconda nota.... :)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.311
  • Ne mors quidem nos iunget
    • Mostra profilo
GAMBAS e MIDI: Programmazione con O.O.S.
« Risposta #14 il: 06 Giugno 2010, 02:49:05 »
Riporto di seguito lo studio che ho compiuto su O.O.S.:

Invio dati relativi agli eventi Midi con O.O.S.

Uso del dispositivo:  /dev/sequencer



Gli eventi Midi devono essere inviati come flusso di dati (stream) al dispositivo " /dev/sequencer ".Tale dispositivo rappresenta, quindi, il dispositivo in grado di supportare il multimediale Midi, e che permette di programmare il sintetizzatore FM o wavetable o dispositivi esterni sul MIDI bus. Il parametro "device" serve proprio per indirizzare l'evento Midi su una certa periferica, corrisponde al MIDI output da usare ed il suo numero identificativo è 0.

Per la sintesi sonora, laddove le schede audio non posseggano il sintetizzatore interno, è necessario servirsi di un softsynth che gestisca la riproduzione sonora appunto a livello software. Softsynth sono, per esempio, Timidity e Fluidsynth. I Softsynth sono, dunque, programmi specifici (client) aventi il compito di interfacciare i sequencer con la scheda audio gestendo preliminarmente la parte sonora vera e propria.

Ovviamente è necessario che il dispositivo sia connesso al softsynth. Il comando per stabilire tale connessione è "aconnect" seguito dal numero identificativo del client " MidiThrough " e della sua porta, che solitamente è 14:0 , nonché del client softsynth e della sua porta. Il comando " aconnect " può essere attivato mediante il comando SHELL.
Senza questo accorgimento non si potrebbero inviare eventi Midi dal sequencer al softsynth, il quale sulla base dei dati Midi ricevuti gestisce i campioni audio del soundbank e li suona sul dispositivo PCM della scheda audio.

L'invio dei dati al device " /dev/sequencer " avviene mediante l'apertura del device medesimo in scrittura all'inizio del programma. In OSS il dispositivo non può essere aperto due volte.

Con " /dev/sequencer " il flusso di dati, che genera un evento midi, è distinguibile sostanzialmente in gruppi di byte costituiti da 4 valori. Di ciascun gruppo:

 - il 1° valore è sempre = 5 e corrisponde a SEQ_MIDIPUTC.
 - il 2° valore corrisponde al comando midi in sé:
      - Evento Midi+canale per il 1°gruppo di dati;
      - 2° parametro dell'evento per il 2° gruppo;
      - 3° eventuale parametro dell'evento per il 3° gruppo.
 - il 3° valore è sempre = 0 (è il parametro del "device").
 - il 4° valore è sempre = 0.

Il numero complessivo di dati da inviare dipende dal tipo di evento Midi da generare. Solitamente il numero di Byte è 12.


Temporizzazione degli eventi Midi:

tre sono le possibili modalità per determinare dopo quanto tempo (Tempo Delta) un evento Midi avverrà rispetto a quello immediatamente precedente:

1 -  Con un'istruzione da 4 byte

Codice: gambas [Seleziona]


WRITE #file, Chr(2), Chr(valore1) &  Chr(valore2) & Chr(valore3), 4

' Chr(2)  = valore identificativo di TMR_WAIT_ABS (tempo assoluto)
' valore1 = da 0 a 255. Qui 255 dovrebbe essere = 2,6 secondi (255/96 tick).
' valore2 = da 0 a 255. Qui invece: 1 = 2,6 sec. , e 255 = 663 sec. (255 * 2,6)

' Esempio:
WRITE #file, Chr(2), Chr(255) &  Chr(2) & Chr(0), 4
'durata dell'evento Midi = 2,6 + (2,6 * 2) = 7,8 secondi



2 -  Con un'istruzione da 8 byte

Codice: gambas [Seleziona]


WRITE #file, Chr(&h81), Chr(2) &  Chr(0) & Chr(0), & Chr(valore1), & Chr(valore2), & Chr(valore3), & Chr(valore4), 8



NOTA: le due istruzioni, sopra descritte, si comportano diversamente da WAIT, e per questo risultano essere più vantaggiose. Infatti, il programma Midi continua comunque a fluire, e la CPU può svolgere relativamente ad esso ogni altra operazione. Questo perché la gestione delle due istruzioni è demandata specificatamente a "/dev/sequencer".

3 -  Uso di Timer

In alternativa, si può usare un ciclo attivato da Timer, con il quale far accadere i vari eventi Midi ogni tot millesimi di secondo.  Il Timer è abbastanza preciso, nonostante presenti, ad ogni tick, alcuni millesimi di imprecisione. Questo significa che ogni nota può iniziare o terminare con alcuni millisecondi di anticipo di o di ritardo, ma ciò può - volendo - essere considerato accettabile.

Un'altra idea potrebbe essere quella di combinare il TIMER con la funzione TIME, la quale ultima restituisce l'orario sino al millisecondo. Il programma assegnerebbe innanzitutto agli eventi Midi un vero e proprio orario, con definizione al millesimo di secondo, in cui ciascuno di essi deve accadere e, quindi, essere inviato al dispositivo /dev/sequencer. Timer si limiterebbe, in tal caso, ad effettuare semplicemente il ciclo per far verificare in ogni istante se è giunto l'orario prestabilito per l'invio dei dati che determineranno l'evento Midi. Ci si affiderebbe così alla precisione dell'orologio interno del computer; e la funzione TIME farebbe da punto di riferimento certo, superando in tal modo, qualora lo si richieda, l'incerta precisione millesimale della funzione Timer.



Esempio pratico dell'uso di  /dev/sequencer :

Codice: gambas [Seleziona]
  ' Gambas class file

PRIVATE midi AS file

PUBLIC SUB Form_open()

DIM device AS String

device = "/dev/sequencer"
 
  ' apre il flusso di dati per la scrittura
midi = OPEN device FOR WRITE

  END

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
PUBLIC SUB ButtonConnessione_Click()

' presuppone il softsynth Timidity installato
' e connette MidiThrough 14:0 a Timidity 128:0
  SHELL "aconnect 14:0 128:0"

END

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
PUBLIC SUB ButtonInvioDati_Click()

' Invio dei gruppi di dati:

WRITE #midi, Chr(5) & Chr(&hC0) & Chr(0) & Chr(0)&     ' definisce l'evento Program Change al canale 1
             Chr(5) & Chr(70) & Chr(0) & Chr(0), 8      ' definisce lo strumento musicale

WRITE #midi, Chr(5) & Chr(&h90) & Chr(0) & Chr(0)&      ' definisce l'evento Note ON al canale 1
             Chr(5) & Chr(60) & Chr(0) & Chr(0)&         ' definisce la nota da suonare
             Chr(5) & Chr(100) & Chr(0) & Chr(0), 12    ' definisce la velocità di tocco (velocity)

WRITE #midi, Chr(2) & Chr(255) &  Chr(2) & Chr(0), 4     ' Temporizzazione con istruzione da 4 byte

WRITE #midi, Chr(5) & Chr(&h80) & Chr(0) & Chr(0)&      ' definisce l'evento Note OFF al canale 1
             Chr(5) & Chr(60) & Chr(0) & Chr(0)&         ' definisce la nota da spegnere
             Chr(5) & Chr(100) & Chr(0) & Chr(0), 12    ' definisce la velocità di tocco (velocity)

END




N O T A :

le cose con la versione 4.0 di OSS sono cambiate per "/dev/sequencer".

Da me specificamente contattato, Hannu Savolainen (che ha redatto soundcard.h) ha risposto:
<< The /dev/sequencer API is no longer part of OSS so it will not work. However you can use the /dev/midi API and write raw MIDI messages to it. The /dev/midi API can do the same than /dev/sequencer. All you need to do is to open /dev/midi (or /dev/midi##) and to write standard MIDI messages to it. The device doesn't provide any timing facilities but you can call usleep() to wait between messages. The /dev/sequencer API was removed because the whole concept was wrong and and it proved to be impossible to document it. There were some plans to develop a replacement but I don't think it will ever get implemented.>>

Inoltre, in http://manuals.opensound.com si legge:
<< The third change in OSS 4.0 is that the development of the previous sequencer (/dev/sequencer and /dev/music) API has been halted. >>
<< The /dev/sequencer device interface for MIDI and synthesizer devices has been
abandoned. This part of the OSS API was redundant with the official MIDI 1.0 specification by MMA.
>>

« Ultima modifica: 08 Settembre 2012, 01:47:25 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »