Autore Topic: Gambas3 e MIDI Sysex con Fluidsynth  (Letto 1159 volte)

Offline genex2000

  • Gamberetto
  • *
  • Post: 7
    • Mostra profilo
Re:Gambas3 e MIDI Sysex con Fluidsynth
« Risposta #15 il: 24 Agosto 2017, 18:14:00 »
E' quello che sto facendo....ci sto sbattendo la testa come al solito in tutto quello che faccio...io vengo dal mondo VB.NET (e ci sono ancora...)
Il bello è che come int di ritorno mi da FLUID_OK cioè come se il sysex se lo prendesse, ma anche con i più elementari (tipo MASTER VOLUME) non va.
Ma che forse (da quello che ho letton in giro) Fluidsynth da sysex accetta solo MIDI tuning sysex ?
O che sia una questione di Device ID errato (dovrebbe essere &H7D come non commercial device ID) ?

Cmq c'è anche un'altra strada da percorrere.....tutta da esplorare...dal wiki libfluidsynth

Citazione
Creating a Real-time MIDI Driver
FluidSynth can process real-time MIDI events received from hardware MIDI ports or other applications. To do so, the client must create a MIDI input driver. It is a very similar process to the creation of the audio driver: you initialize some properties in a settings instance and call the new_fluid_midi_driver() function providing a callback function that will be invoked when a MIDI event is received. ..
:-\

Farotti sapere...... :D



Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gambas3 e MIDI Sysex con Fluidsynth
« Risposta #16 il: 24 Agosto 2017, 18:53:25 »
E' quello che sto facendo....ci sto sbattendo la testa come al solito
Prego per te:

" O San Midi benedetto,
   hai condotto qui questo fratello.
   E' tuo servo e del midi è già provetto.
   Allevia tu, dunque, ogni suo fardello !
"

    sanmidi




Ma che forse (da quello che ho letton in giro) Fluidsynth da sysex accetta solo MIDI tuning sysex ?
Sei almeno riuscito efficacemente, come test, ad inviare almeno questo messaggio ?

Ad ogni modo, sarei sorpreso sommamente se quel limite fosse vero !   :rolleyes:


Non mi hai detto ancora come (il codice) scrivi i dati nella porzione di memoria puntata dal Puntatore del 2°parametro della funzione fluid_synth_sysex ( ) .



Cmq c'è anche un'altra strada da percorrere.....tutta da esplorare...
...però cerca di definire in un modo o in un altro la questione, già avviata, dell'uso della funzione esterna fluid_synth_sysex ( ) .   
« Ultima modifica: 24 Agosto 2017, 20:51:26 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 genex2000

  • Gamberetto
  • *
  • Post: 7
    • Mostra profilo
Re:Gambas3 e MIDI Sysex con Fluidsynth
« Risposta #17 il: 24 Agosto 2017, 21:55:48 »
 :rotfl:  ....questa di San Midi Benedetto è forte....

Cmq, ecco il codice ( premetto....array di string o bytes non cambia nulla)

Private sysex As String[] = [&H7F, &H7F, &H04, &H01, 0, 0] 
' è un banalissimo Master Volume settato a 0 ( almeno dovrebbe)
preso da qui :
https://github.com/ahlstromcj/midicvt/blob/master/contrib/sysex-format.txt

...
e nella Sub relativa...
 Dim d As Integer
 d = fluid_synth_sysex(synth, VarPtr(sysex), sysex.Length, Null, 0, 0, 1)

d mi ritorna FLUID_OK  (0) ma non succede niente....

Mi sa che oltre a San Midi serve anche San Remo......LOL

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gambas3 e MIDI Sysex con Fluidsynth
« Risposta #18 il: 25 Agosto 2017, 01:37:05 »
premetto....array di string o bytes non cambia nulla
Il 2° parametro della funzione esterna (id est: ...esterna alle funzioni native di Gambas) " fluid_synth_sysex( ) " del sistema libfluidsynth prevede il passaggio di un Puntatore a "char" costante. Poiché il tipo "char" occupa 1 byte (8bit), ne consegue che l'intera area di memoria riservata puntata dal Puntatore ha una dimensione di 1 * numero_di_byte_scritti, come si può evincere da questo test che riprende i dati del tuo esempio:
Codice: [Seleziona]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main() {

char src[] = {0x7f, 0x7f, 0x04, 0x01, 0x00, 0x0};
char *sysex =  malloc(6);
memcpy(sysex, src, 6);

printf("%ld\n", sizeof(*sysex));

        free(sysex);

      return (0);

}

In Gambas il tipo di dato "String" occupa 4 byte nei sistemi a 32 bit e 8 byte nei sistemi a 64 bit:
http://gambaswiki.org/wiki/lang/type
ciò perché il dato "String" in Gambas è in realtà un puntatore a una struttura più complessa che contiene, fra l'altro, la lunghezza della stringa.
Dunque l'area di memoria di un vettore di tipo "String" occupata per la memorizzazione di ciascuna stringa di valori/caratteri, intesa come "indirizzo di memoria ad una sub-area distinta ove sono contenuti i veri dati", corrisponde in ogni caso a una quantità di byte pari a:
 SizeOf(gb.String) * vettore.Count
Ciò avviene anche nel caso come il tuo, nel quale istanzi l'array attribuendo un valore numerico (in rappresentazione esadecimale) a ciascun elemento dell'array medesimo. Laddove presumibilmente Gambas converte ogni valore numerico automaticamente in stringa composta da simbolo/i numerico/i.

Cerco di spiegarmi tecnicamente con questo semplicissimo codice esemplificativo:
Codice: [Seleziona]
Public Sub Main()

  Dim sysex As String[] = [&H7F, &H7F, &H04, &H01, 0, 0]
  Dim i As Integer

   For i = 0 To 47
     If i Mod 8 == 0 Then Write "------------ elem. indice " & CStr(i \ 8) & Chr(&0A)
     Print i, Hex(Byte@(sysex.Data + i), 2)
   Next
   
   Print "=============="
   
   For i = 0 To 47
     Print i, String@(Pointer@(sysex.Data + i))
   Next

End

Se ciò che ho scritto sin'ora è giusto, tu passi un'area riservata i cui valori sono gli indirizzi di memoria dei singoli valori di tipo Stringa, contenuti nei sei elementi costituenti l'array, anziché passare un'area riservata contenente 6 byte rappresentanti i secchi valori del messaggio di sysex.
Pertanto, io credo tu debba cambiare il tipo di dato dell'array da String[ ] a Byte[ ], poiché la memoria occupata dal tipo di dato "Byte" in Gambas corrisponde alla quantità occupata dal tipo " char " in C, e che da codice è agevolmente costatabile con la seguente istruzione:
 SizeOf(gb.Byte)

Inoltre, per passare agevolmente l'indirizzo di memoria dell'area riservata di un array, ove sono memorizzati i dati, va utilizzata la proprietà " .Data " dell'array medesimo.



Al di là di queste mie riflessioni, va fatto notare ai lettori come il nostro amico genex2000 ha abilmente utilizzato un Oggetto vettore statico per memorizzare in un'area allocata i dati necessari.
I miei complimenti.
Sempre ai lettori ricordo che in alternativa genex2000 avrebbe potuto utilizzare ovviamente anche una variabile di tipo Puntatore da allocare opportunamente e nella quale, poi, scrivere mediante i "Memory Stream" i dati necessari.
« Ultima modifica: 25 Agosto 2017, 16:06:36 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 genex2000

  • Gamberetto
  • *
  • Post: 7
    • Mostra profilo
Re:Gambas3 e MIDI Sysex con Fluidsynth
« Risposta #19 il: 25 Agosto 2017, 17:44:56 »
...amico mio...perdiamo solo tempo......Fluidsynth processa solo Sysex di tipo MIDI Tuning Standard..... :'( :'(....
..dalla 1.1.0....
Citazione
SYSEX support (MIDI Tuning Standard only at the moment).

 >:(

Devo trovare un altra strada.....

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gambas3 e MIDI Sysex con Fluidsynth
« Risposta #20 il: 25 Agosto 2017, 18:46:27 »
...amico mio...perdiamo solo tempo......Fluidsynth processa solo Sysex di tipo MIDI Tuning Standard.....
:o
Incredibile !

Va be'... quel "at moment" ti fa sperare... per il futruro !    :)
« Ultima modifica: 25 Agosto 2017, 18:48:53 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.264
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Gambas3 e MIDI Sysex con Fluidsynth
« Risposta #21 il: 26 Agosto 2017, 17:39:04 »
.... cambiare il tipo di dato dell'array da String[ ] a Byte[ ], poiché la memoria occupata dal tipo di dato "Byte" in Gambas corrisponde alla quantità occupata dal tipo " char " in C, e che da codice è agevolmente costatabile con la seguente istruzione:
 SizeOf(gb.Byte)
Vorrei anche segnalare questo mio intervento:

http://www.gambas-it.org/smf/index.php?topic=5794.msg41802#msg41802
« 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. »