Hello everybody !

First of all, because my main e-mail is down for the moment, this is my 
secondary mails :

        [EMAIL PROTECTED]
        [EMAIL PROTECTED]

Thanx for your comprehension !

Secondly, this is my problem : i'm trying to do a dump program to a 
microverb IV to save my patchs. So, I send a sysex to the rack, and 
normally the sysex send me another sysex. So, for the moment, 
everything is working : computer send sysex and the rack send his sysex 
too... BUT... Normally, the sysex sent by the rack is stocked in a 
specific buffer (an unsigned char buffer, in fact). In my case, I find 
in this buffer... the first message, send by the computer to the rack, 
my request buffer !! So I repeat the action (without closing the two 
rawmidi handles), and I found after a few try the sysex sent by the 
rack in my buffer !
        I'm thinking the buffer isn't emptied after each call (but 
remind the computer and the rack send their respective sysex well !). 
So i'm doing a drain of the handle_out after each snd_rawmidi_write, 
but it seem to don't working...
        This is the source code :

/* START OF SOURCE */

#include <alsa/asoundlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

typedef struct {
        int prog;       //num of program
        int a;          //A parameter
        int b;          //B parameter
        int bank;       //bank number (0 = preset, 1 = user)
} pdb;

void affiche(unsigned char a[]) {
        int i=-1;
         
        printf("The next SySex have been sent trough RawMidi\n");
         
         
        while (a[i++] != 0xf7) {
                printf("%x",a[i]);
                printf(" ");
        }
        printf("\n");
        printf("\n");
         
        return;
}

pdb collect() {
        //non definitive function, here just for test without graphical 
interface
         
        pdb data;
         
        printf("Program number (0 - 99) : ");
        scanf("%d",&data.prog);
        printf("A parameter (0 - 127) : ");
        scanf("%d",&data.a);
        printf("B parameter (0 - 127) : ");
        scanf("%d",&data.b);
        printf("Bank number (0=preset, 1=user) : ");
        scanf("%d",&data.bank);
         
        return data;
}

int num_programme() {
        //non definitive function, here just for test without graphical 
interface
         
        int i;
         
        printf("Quel est le numero du programme ?\n");
        scanf("%d",&i);
         
        return i;
}

void entete(unsigned char mess[]) {

        /* start of SySex */
        mess[0]=0xf0;
        /* identification Alesis */
        mess[1]=0x00;
        mess[2]=0x00;
        mess[3]=0x0e;
        /*identification microverb IV*/
        mess[4]=0x12;
        /* MIDI channel (0x00 = omni) */
        mess[5]=0x00;
}
void path(char filename[]) {

        printf("Enter the path to the sysex : ");
        scanf("%s",filename);
}

void read_from_file(char filename[],unsigned char buf[],int size) {
         
        FILE *fd;

        //open the file
        fd=fopen(filename,"r");
         
        //read the stream
        fread(buf,size,1,fd);

        //close the file
        fclose(fd);
}

void load_sysex(unsigned char sysex[],int size) {
        char path_to[256];
                 
        path(path_to);
        read_from_file(path_to,sysex,size);
}

void dump_single(snd_rawmidi_t *handle) {
        unsigned char sysex[11];
         
        //creation du unsigned char
        load_sysex(sysex,12);
         
        //envoie du unsigned char
        snd_rawmidi_write(handle,sysex,12);
        affiche(sysex);
         
        return;
}


void dump_store(snd_rawmidi_t *handle) {

        snd_rawmidi_write (handle,"\xf0\x00\x00\x0e\x12\x00\x03\xf7", 
8);
        snd_rawmidi_drain(handle);
}

void dump_all(snd_rawmidi_t *handle) {
        unsigned char sysex[307];
        int i,flag;
        struct timespec *delay;
         
        delay=(struct timespec *)malloc(sizeof(struct timespec));
                 
        // definie le delai de 10ms
        delay->tv_sec=0;
        delay->tv_nsec=10000000;
         
        //chargement du sysex
        load_sysex(sysex,308);
         
        //envoie l'entete du sysex
        for (i=0;i<7;i++)
                snd_rawmidi_write (handle,&sysex[i],1);
        snd_rawmidi_drain(handle);
         
        flag=0;
         
        while (i!=308) {
                snd_rawmidi_write (handle,&sysex[i],1);
                i++;
                flag++;
                if (flag==3) {
                        nanosleep(delay,NULL);
                        flag=0;
                        snd_rawmidi_drain(handle);
                }
        }
         
        affiche(sysex);
}

void sysex_dump_buffer(unsigned char sx[], pdb data) {
        // head of SySex
        entete(sx);
         
        //opcode DUMP_BUFFER
        sx[6]=0x00;
         
        //numero de programme
        sx[7]=data.prog;
         
        //parametre A
        sx[8]=data.a;
         
        //parametre B
        sx[9]=data.b;
         
        //choix de la banque
        sx[10]=data.bank;
         
        //SySex definition
        sx[11]=0xf7;
         
        return;
}

void dump_buffer(snd_rawmidi_t *handle, pdb data) {
        unsigned char sysex[11];
         
        //creation du unsigned char
        sysex_dump_buffer(sysex,data);
         
        //envoie du unsigned char
        snd_rawmidi_write(handle,sysex,12);
        snd_rawmidi_drain(handle);
         
        affiche(sysex);
         
        return;
}

void request_buffer(snd_rawmidi_t *handle_out,snd_rawmidi_t *handle_in) 
{
        unsigned char rec[11];
         
        //envoie du unsigned char
         
snd_rawmidi_write(handle_out,"\xf0\x00\x00\x0e\x12\x00\x40\xf7",8);
        snd_rawmidi_drain(handle_out);
         
        //reception du buffer
        snd_rawmidi_read(handle_in,rec,12);
         
        affiche(rec);
         
        return;
}

void sysex_request_single(unsigned char sx[],unsigned char num_prog){
        // head of SySex
        entete(sx);
         
        //opcode REQUEST_SINGLE
        sx[6]=0x42;
         
        //numero de programme
        sx[7]=num_prog;
         
        //SySex definition
        sx[8]=0xf7;
         
        return;
}

void request_single(snd_rawmidi_t *handle_out,snd_rawmidi_t 
*handle_in,unsigned char num_prog) {
        unsigned char sysex[8],rec[11];
         
        //creation du unsigned char
        sysex_request_single(sysex,num_prog);
         
        //envoie du unsigned char
        snd_rawmidi_write(handle_out,sysex,9);
        snd_rawmidi_drain(handle_out);
         
        //reception du buffer
        snd_rawmidi_read(handle_in,rec,12);
         
        affiche(rec);
         
        return;
}

void request_all(snd_rawmidi_t *handle_out,snd_rawmidi_t *handle_in) {
        unsigned char rec[307];
         
        //envoie du request
         
snd_rawmidi_write(handle_out,"\xf0\x00\x00\x0e\x12\x00\x41\xf7",8);
        snd_rawmidi_drain(handle_out);
         
        //reception de tous les programmes
        snd_rawmidi_read(handle_in,rec,308);
         
        affiche(rec);
         
        return;
}

int main (int argc,char **argv) {
         
        int choix;
        int err;
        char *device;
        snd_rawmidi_t *handle_in,*handle_out;   //### VARIABLE A 
DECOMMENTER QUAND ON REACTIVE L'ENVOIE DU SYSEX ###

        device=argv[1];  
         
        //ouverture des peripherique midi
        //ouverture en lecture
        err = snd_rawmidi_open(&handle_in,NULL,device,0);
        if (err)
                printf("snd_rawmidi_open IN a echoue...\n");
         
        //ouverture en lecture
        err = snd_rawmidi_open(NULL, &handle_out, device, 0);
        if (err)
                printf("snd_rawmidi_open OUT a echoue...\n");
         
        printf("Interface logicielle Microverb IV <--> Linux\n");
        printf("Ce programme permet de generer des SySex et de les 
afficher a l'ecran\n");
        printf("\n");
         
        while (choix != 0) {
                printf("1 - dump edit buffer\n");
                printf("2 - dump all user program\n");
                printf("3 - dump single program\n");
                printf("4 - dump store program\n");
                printf("5 - request edit buffer\n");
                printf("6 - request all user program\n");
                printf("7 - request single program\n");
                printf("0 - bye bye !!\n");
                printf("\n");
                printf("CHOIX : ");
                scanf("%d",&choix);
                printf("\n");
                 
                switch (choix) {
                        case 1 : 
dump_buffer(handle_out,collect());break;
                        case 2 : dump_all(handle_out);break;
                        case 3 : dump_single(handle_out);break;
                        case 4 : dump_store(handle_out);break;
                        case 5 : 
request_buffer(handle_out,handle_in);break;
                        case 6 : 
request_all(handle_out,handle_in);break;
                        case 7 : 
request_single(handle_out,handle_in,num_programme());break;
                }
        }
         
        //fermeture du peripherique midi
        snd_rawmidi_close(handle_in);
        snd_rawmidi_close(handle_out);

        return 0;
}

/* END OF SOURCE */

        Please help me, I'm going insane !

Charles

_______________________________________________________________

Have big pipes? SourceForge.net is looking for download mirrors. We supply
the hardware. You get the recognition. Email Us: [EMAIL PROTECTED]
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to