thx has worked:
FILE_ReadBuffer((u8 *)Sequence[track], sizeof(Sequence[track])); //u8 Sequence[8][512][8]
FILE_WriteBuffer((u8 *)Sequence[track], sizeof(Sequence[track])); //u8 Sequence[8][512][8]
call: SD(track, clip, job);
for example: SD(6,1,2); //track 6 dont matter, ProgramChange 1, Load all Clips
SD(0,7,1);//track 0, ProgramChange 7, Load single Clip (clip 7-0.sq)
SD(0,1,3);//track 0 , ProgramChange 1, Store single Clip (clip 1-0.sq)
SD(2,1,4);//track 2 dont matter, ProgramChange 1, Store all Clips
SD(2,1,5);//track 2 dont matter, ProgramChange 1 dont matter, Copy track 0-0.sq 512x8 times on SD-Card = Make filestructure = initalize SD-Card > take 20 Minutes
full code: http://wiki.midibox.org/lib/exe/fetch.php?media=phatline:seq-melody-footboard.zip
relativly stripped down the SD-Management is done by:
u8 clip\_is\_virgin = 1; u16 BPM = 120; u8 Rythm = 4; u8 SetDecayTime[8] = {60,60,60,60, 60,60,60,60}; us u8 Loop\_Length[8] = {1,4,1,4, 1,4,1,4}; u8 CC\_SD[8][32] = {}; //Save all other Variables into this Array - for SD-Card... u8 CC\_MSQ[8][512] = {}; u8 Sequence[8][512][8]={{{}}}; xSemaphoreHandle xSDCardSemaphore;// take and give access to SD-Card xSemaphoreHandle xLCDSemaphore;// take and give access to LCD static file\_t midifile\_fi; //used to read files from SD-Card #define MUTEX\_LCD\_TAKE { while( xSemaphoreTakeRecursive(xLCDSemaphore, (portTickType)0) != pdTRUE ); }//a Mutex reserve LCD/SD for a task, until it is given away... #define MUTEX\_LCD\_GIVE { xSemaphoreGiveRecursive(xLCDSemaphore); } #define PRIORITY\_SD ( tskIDLE\_PRIORITY + 3 ) //3:Mios standart static void SD(u8 track, u16 clip, u16 job); void APP\_Init(void){ xLCDSemaphore = xSemaphoreCreateRecursiveMutex(); // create Mutex for LCD access xSDCardSemaphore = xSemaphoreCreateRecursiveMutex();//create Mutex for SD-Card access FILE\_Init(0);// initialize file functions } void APP\_Tick(void){ //@1mS rate SDCardCount++;//CHECK SD-Car every 2sec. if(SDCardCount \> 2000) { SDCardCount = 0; SD(0, 0, 5); } //2s Counter \> send Check-SDCard-Commant to StoreLoad-Function (u8 track, u16 clip, u16 job) }
// S T O R A G E - SD - C A R D /// read write clips/programchanges static void SD(u8 track, u16 clip, u16 job){//Job1=load all, Job2=store all, Job3=initalize card u8 t = 0; //track counter initation switch(job) { // R E A D /////////////////////////////////////////////////////////////////////////////////////////////////////// case 1: //LOAD single Clip MUTEX\_SDCARD\_TAKE; sprintf(filepathL, "sq/%d-%d.sq", track, clip); FILE\_ReadOpen (&midifile\_fi, filepathL); FILE\_ReadBuffer((u8 \*)file\_typeBank,4); FILE\_ReadBuffer((u8 \*)CC\_SD [track],sizeof(CC\_SD [track])); FILE\_ReadBuffer((u8 \*)CC\_MSQ [track],sizeof(CC\_MSQ [track])); //Control-Change-Motion-Sequence FILE\_ReadBuffer((u8 \*)Sequence[track],sizeof(Sequence [track])); //u8 Sequence[8][512][8] FILE\_ReadBuffer((u8 \*)PB [track],sizeof(PB [track])); FILE\_ReadClose (&midifile\_fi); MUTEX\_SDCARD\_GIVE; //Paste Variables from Array Rythm= CC\_SD[track][1]; Loop\_Length[track]= CC\_SD[track][2]; BPM = CC\_SD[track][4]; SetDecayTime[track] = CC\_SD[track][5]; //Calculate new Loop Lengths Loop[track]= Loop\_Length[track] \* MainLoop; //SEQ\_BPM\_Set(BPM); NeedSync = 1; //update ClockCounter when ready... SongNrStor = SongNrLoad; //transfair load nr 2 store nr. break; case 2: //LOAD all Clips - FOR P R O G R A M C H A N G E for( t=0; t\<8; t++) { MUTEX\_SDCARD\_TAKE; sprintf(filepathL, "sq/%d-%d.sq", t, clip); FILE\_ReadOpen (&midifile\_fi, filepathL); FILE\_ReadBuffer((u8 \*)file\_typeBank,4); FILE\_ReadBuffer((u8 \*)CC\_SD [t],sizeof( CC\_SD [t])); FILE\_ReadBuffer((u8 \*)CC\_MSQ [t],sizeof( CC\_MSQ[t])); //Control-Change-Motion-Sequence FILE\_ReadBuffer((u8 \*)Sequence[t],sizeof(Sequence[t])); //u8 Sequence[8][512][8] FILE\_ReadBuffer((u8 \*)PB [t],sizeof( PB[t])); FILE\_ReadClose (&midifile\_fi); MUTEX\_SDCARD\_GIVE; //Paste Variables from Array Rythm= CC\_SD[t][1]; Loop\_Length[t]= CC\_SD[t][2]; BPM = CC\_SD[t][4]; SetDecayTime[t]= CC\_SD[t][5]; //Calculate new Loop Lengths Loop[t]= Loop\_Length[t] \* MainLoop; } //SEQ\_BPM\_Set(BPM); NeedSync = 1; //update ClockCounter when ready... SongNrStor = SongNrLoad; //transfair load nr 2 store nr. MUTEX\_LCD\_TAKE; MIOS32\_LCD\_DeviceSet(2); MIOS32\_LCD\_Clear(); MIOS32\_LCD\_CursorSet(0, 0); MIOS32\_LCD\_PrintFormattedString ("%s", "PROGRAM LOAD - Finished"); MUTEX\_LCD\_GIVE; Update\_LCD\_s = 1; //normal LCD-Labeling in back again in a second break; // S T O R E ///////////////////////////////////////////////////////////////////////////////////////////////////// case 3: //S T O R E Single Clip //Fill CC-Array of Clip CC\_SD[track][0] = clip\_is\_virgin; CC\_SD[track][1] = Rythm; CC\_SD[track][2] = Loop\_Length[track]; CC\_SD[track][4] = BPM; CC\_SD[track][5] = SetDecayTime[track]; MUTEX\_SDCARD\_TAKE; //Write to File sprintf(filepathS, "sq/%d-%d.sq", track, clip); FILE\_WriteOpen (filepathS,1); FILE\_WriteBuffer((u8 \*)file\_typeBank,4); //"SQ01" = 4 Positons FILE\_WriteBuffer((u8 \*)CC\_SD [track],sizeof(CC\_SD [track])); //Track Variables like Looplenght FILE\_WriteBuffer((u8 \*)CC\_MSQ [track],sizeof(CC\_MSQ [track])); //Control-Change-Motion-Sequence FILE\_WriteBuffer((u8 \*)Sequence[track],sizeof(Sequence[track])); //u8 Sequence[8][512][8] FILE\_WriteBuffer((u8 \*)PB [track],sizeof(PB [track])); FILE\_WriteClose (); MUTEX\_SDCARD\_GIVE;//SD-Card is now free 4 access Update\_LCD\_s = 1; //normal LCD-Labeling in back again in secunds SongNrLoad = SongNrStor; //transfair load nr 2 store nr. break; case 4: //S T O R E all Clips - FOR P R O G R A M C H A N G E for( t=0; t\<8; t++){ // store file once by once //Fill CC-Array of Clip CC\_SD[t][0] = clip\_is\_virgin; CC\_SD[t][1] = Rythm; CC\_SD[t][2] = Loop\_Length[t]; CC\_SD[t][4] = BPM; CC\_SD[t][5] = SetDecayTime[t]; MUTEX\_SDCARD\_TAKE; //Write to File sprintf(filepathS, "sq/%d-%d.sq", t, clip); FILE\_WriteOpen (filepathS,1); FILE\_WriteBuffer((u8 \*)file\_typeBank,4);//"SQ01" = 4 Positons FILE\_WriteBuffer((u8 \*)CC\_SD [t],sizeof(CC\_SD [t]));//Track Variables like Looplenght FILE\_WriteBuffer((u8 \*)CC\_MSQ [t],sizeof(CC\_MSQ [t]));//Control-Change-Motion-Sequence FILE\_WriteBuffer((u8 \*)Sequence[t],sizeof(Sequence[t])); //u8 Sequence[8][512][8] FILE\_WriteBuffer((u8 \*)PB [t],sizeof(PB [t])); FILE\_WriteClose (); MUTEX\_SDCARD\_GIVE;//SD-Card is now free 4 access } SongNrLoad = SongNrStor; //transfair load nr 2 store nr. MUTEX\_LCD\_TAKE; MIOS32\_LCD\_DeviceSet(2); MIOS32\_LCD\_Clear(); MIOS32\_LCD\_CursorSet(0, 0); MIOS32\_LCD\_PrintFormattedString ("%s", "PROGRAM STORE - Finished"); MUTEX\_LCD\_GIVE; Update\_LCD\_s = 1; //normal LCD-Labeling in back again in secunds break; // I N I T - S D - CARD //////////////////////////////////////////////////////////////////////////////////7////// case 5: //SD-Card Initalize MUTEX\_SDCARD\_TAKE;//SD-Card is now only for the following LINES reserved: statusSD = FILE\_CheckSDCard(); switch(statusSD) { case 2: MUTEX\_LCD\_TAKE; MIOS32\_LCD\_DeviceSet(2); MIOS32\_LCD\_Clear(); MIOS32\_LCD\_CursorSet(0, 0); MIOS32\_LCD\_PrintFormattedString ("%s", "NO SD-Card"); MUTEX\_LCD\_GIVE;break; case 3: if(!FILE\_SDCardAvailable() ) {MUTEX\_LCD\_TAKE; MIOS32\_LCD\_DeviceSet(2); MIOS32\_LCD\_Clear(); MIOS32\_LCD\_CursorSet(0, 0); MIOS32\_LCD\_PrintFormattedString ("%s", "Insert-FAT-Formated-SD-Card"); MUTEX\_LCD\_GIVE; break;} if(!FILE\_VolumeAvailable() ) {MUTEX\_LCD\_TAKE; MIOS32\_LCD\_DeviceSet(2); MIOS32\_LCD\_Clear(); MIOS32\_LCD\_CursorSet(0, 0); MIOS32\_LCD\_PrintFormattedString ("%s", "Format SD-Format to FAT first!"); MUTEX\_LCD\_GIVE; break;} break; case 1: // YES CARD! \>\>\> next: check Card-content statusDir = FILE\_DirExists("sq");//ask file.c: exist a folder "t/" on the CARD? if(statusDir == 1){MUTEX\_LCD\_TAKE; MIOS32\_LCD\_DeviceSet(2); MIOS32\_LCD\_Clear(); MIOS32\_LCD\_CursorSet(0, 0); MIOS32\_LCD\_PrintFormattedString ("%s", "good SD-file structure");MenueUpdateFlag = 0;MUTEX\_LCD\_GIVE; break;} if(statusDir == 0){MUTEX\_LCD\_TAKE; MIOS32\_LCD\_DeviceSet(2); MIOS32\_LCD\_Clear(); MIOS32\_LCD\_CursorSet(0, 0); MIOS32\_LCD\_PrintFormattedString ("%s", "create 4096 Files on SDC it takes 20min - really!-wait!!! ");MUTEX\_LCD\_GIVE; //Fill CC-Array of Clip CC\_SD[track][0] = clip\_is\_virgin; CC\_SD[track][1] = Rythm; CC\_SD[track][2] = Loop\_Length[track]; CC\_SD[track][4] = BPM; CC\_SD[track][5] = SetDecayTime[track]; FILE\_MakeDir("sq"); //Write to File sprintf(filepathS, "sq/%d-%d.sq", track, clip); FILE\_WriteOpen (filepathS,1); FILE\_WriteBuffer((u8 \*)file\_typeBank,4); //"SQ01" = 4 Positons FILE\_WriteBuffer((u8 \*)CC\_SD[track],32); //Track Variables like Looplenght FILE\_WriteBuffer((u8 \*)CC\_MSQ[track],sizeof(CC\_MSQ[track]));//Control-Change-Motion-Sequence FILE\_WriteBuffer((u8 \*)Sequence[track],sizeof(Sequence[track])); //u8 Sequence[8][512][8] FILE\_WriteBuffer((u8 \*)PB[track],sizeof(PB[track])); FILE\_WriteClose (); //copy-prototype file to 512x8 clip files on SD-Card for(t=0; t\<8; t++){ s16 clipcount = 0; //declare and set the Bank Counter inital value to 0 for(clipcount=0; clipcount\<512; clipcount++){//countes 2 511 and do following commandos 511 times in a loop: char copyfilepath[16]; sprintf(copyfilepath, "sq/%d-%d.sq", t, clipcount); //make a new filename depending on the counter value 1.sq, 2.sq, 3.sq...511.sq FILE\_Copy ((char \*)"sq/0-0.sq", (char \*)copyfilepath);} //copy the File 0.tm to all other 511 files... } //SD-Card is now free 4 apbess MUTEX\_LCD\_TAKE; MIOS32\_LCD\_DeviceSet(0); MIOS32\_LCD\_Clear(); MIOS32\_LCD\_CursorSet(0, 0); MIOS32\_LCD\_PrintFormattedString ("%s", "SD-CARD - INIT - FINISHED"); MUTEX\_LCD\_GIVE;MenueUpdateFlag = 0;} break; } MUTEX\_SDCARD\_GIVE; } }
maybe that helps anyone, or me in the future…