diff --git a/Yocto/Check_Edit_Button.ino b/Yocto/Check_Edit_Button.ino index f9c4ed1..054d039 100644 --- a/Yocto/Check_Edit_Button.ino +++ b/Yocto/Check_Edit_Button.ino @@ -31,7 +31,7 @@ void Check_Edit_Button_Pattern_Edit() //---------------------- //check le bouton play case 1: // Play button. - if(old_selected_mode==0 || old_selected_mode==3){ + if (sync_mode == MASTER) { button_play_count++; if(button_play_count==1){ play=1; @@ -150,7 +150,7 @@ void Check_Edit_Button_Pattern() //---------------------- //check le bouton play case 1: - if(sync_mode == MASTER){//selected_mode==0 || selected_mode==3){ + if (sync_mode == MASTER) { button_play_count++; if(button_play_count==1){ //ppqn_count=0; @@ -165,7 +165,6 @@ void Check_Edit_Button_Pattern() first_stop=1; } } - //Serial.println(play,DEC);//DEBUGG break; //------------------------- //check bouton scale diff --git a/Yocto/DinSync_out.ino b/Yocto/DinSync_out.ino new file mode 100644 index 0000000..7a37794 --- /dev/null +++ b/Yocto/DinSync_out.ino @@ -0,0 +1,18 @@ +// All function related to dinsync handling. + +void Set_Dinsync_Clock_High() { + PORTD |= (1<<4); // Set the clock high. + dinsync_clock_timeout = 4; // 4ms clock. +} + +void Set_Dinsync_Clock_Low() { + PORTD &= ~(1<<4); // Lower the clock signal. +} + +void Set_Dinsync_Run_High() { + PORTD |= (1<<5); // Set Run = 1. +} + +void Set_Dinsync_Run_Low() { + PORTD &= ~(1<<5); // Set Run = 0. +} \ No newline at end of file diff --git a/Yocto/EEprom_Fonction.ino b/Yocto/EEprom_Fonction.ino index 4d0a8ae..cd7a517 100644 --- a/Yocto/EEprom_Fonction.ino +++ b/Yocto/EEprom_Fonction.ino @@ -850,11 +850,11 @@ void Play_Version() { byte count = 0; while ( count < major_version ) { PORTC |= (1 << 7); - PORTB |= (1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas + Set_CPU_Trig_High(); SR.ShiftOut_Update(temp_step_led,0b10); delay(200); PORTC &= ~(1 << 7); - PORTB &= ~(1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas + Set_CPU_Trig_Low(); SR.ShiftOut_Update(temp_step_led,0); delay(100); count++; @@ -862,11 +862,11 @@ void Play_Version() { count=0; while ( count < minor_version ) { PORTC |= (1 << 6); - PORTB |= (1<<2);// met a 0 la sorti TRIG CPU + Set_CPU_Trig_High(); SR.ShiftOut_Update(temp_step_led,0b10000000); delay(200); PORTC &= ~(1 << 6); - PORTB &= ~(1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas + Set_CPU_Trig_Low(); SR.ShiftOut_Update(temp_step_led,0); delay(100); count++; diff --git a/Yocto/Interruption_fonction.ino b/Yocto/Interruption_fonction.ino index 55b73d3..ec259e1 100644 --- a/Yocto/Interruption_fonction.ino +++ b/Yocto/Interruption_fonction.ino @@ -8,26 +8,22 @@ void Count_96PPQN() // if ( selected_mode == MIDI_PLAY ) return; - - - //PORTB &=~(1<<2);// met a 0 la sorti TRIG CPU + //Set_CPU_Trig_Low(); Reset_Trig_Out(); - //MODE ROLL - if(roll_mode && ppqn_count%roll_scale[scale_type][roll_pointer] == 0 && inst_roll>0){ - PORTB |= (1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas - - } - if(step_changed){ - - SR.ShiftOut_Update(temp_step_led,((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll)); - Send_Trig_Out(); + if (step_changed) { step_changed=0; - PORTB |= (1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas - + SR.ShiftOut_Update(temp_step_led,((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll)); + Send_Trig_Out((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll); + Set_CPU_Trig_High(); } - else{ + else { SR.ShiftOut_Update(temp_step_led,inst_roll); + //MODE ROLL + if (roll_mode && ppqn_count%roll_scale[scale_type][roll_pointer] == 0 && inst_roll>0) { + Send_Trig_Out(inst_roll); + Set_CPU_Trig_High(); + } } ppqn_count++;//incremente le compteur PPQN96 @@ -53,9 +49,9 @@ void Count_96PPQN() if(first_play){ MIDI_Send(0xfa);//Serial1.write(0xfa);//Midi Start ppqn_count=0;//initialise le compteur PPQN - PORTD |= (1<<5);// met au niveau haut le sorti Din start - PORTD &= ~(1<<4);// met au niveau bas le sorti Din - Send_Trig_Out(); + Set_Dinsync_Run_High(); + Set_Dinsync_Clock_Low(); + //Send_Trig_Out(); first_play=0; } // the first note after the push on start needs to be shifted over / delayed one pulse @@ -63,7 +59,7 @@ void Count_96PPQN() //la premiere note apres l'appuie sur start doit etre decale d'une pulsation //de PPQN pour etre calée avec la premiere note de la machine en SLAVE DIN if (first_play_A && (ppqn_count==1)){ - PORTB |= (1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas + Set_CPU_Trig_High(); SR.ShiftOut_Update(temp_step_led,(inst_step_buffer[0][pattern_buffer])&(~inst_mute)); first_play_A=0;//initialise le flag } @@ -118,26 +114,28 @@ void Count_96PPQN() } step_count=0;//reinitialise a 0 le step compteur debut_mesure_count=0; - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); if (tempo_led_count>=48){ tempo_led_count=0;//si le compteur egale un temps on le reinitialise tempo_led_flag=!tempo_led_flag;//on alterne la valeur du flag de la led tempo. } } - //incrementer la clock de la synchro DIN tous les 4 PPQN96 pour avoir PPQN24 + + // Send DinSync clock (at 24ppqn). if((ppqn_count%2)==1){ //modulo de 2 = 1 car la clock PPQN et la clock din sont decaler d'un demi cylce bitWrite(PORTD,4,!(bitRead (PIND,4))); } - //Incrementer la clock Midi tous les 4 PPQN96 pour avoir PPQN24 + + // Send MIDI beat clock (at 24ppqn). if((ppqn_count%4)==1){ - MIDI_Send(0xf8);//Serial1.write (0xf8); + MIDI_Send(0xf8); } for (int tempx=0; tempx<500; tempx++) { }//tempo pour que la pulse CPU soit egal a 1ms - PORTB &= ~(1<<2);// met a 0 la sorti TRIG CPU + Set_CPU_Trig_Low(); } @@ -157,7 +155,7 @@ void Count_Clock() { if (dinsync_clock_timeout != 0) { dinsync_clock_timeout--; if (dinsync_clock_timeout == 0) { - PORTD &= ~(1<<4); // Lower the clock signal. + Set_Dinsync_Clock_Low(); } } } @@ -172,25 +170,25 @@ void Count_Clock() { ISR (PCINT3_vect) { Reset_Trig_Out(); + //PLAY================================================================= if(PIND & (1<<4) && play){ - PORTB &= ~(1<<2);// met a 0 la sorti TRIG CPU; - //MODE ROLL - if(roll_mode && ppqn_count%(roll_scale[scale_type][roll_pointer]/4) == 0 && inst_roll>0){// - PORTB |= (1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas - //SR.ShiftOut_Update(temp_step_led,inst_roll); - //Send_Trig_Out(); - } - //Si le pas a changer - if(step_changed){ - SR.ShiftOut_Update(temp_step_led,inst_step_buffer[step_count][pattern_buffer]&(~inst_mute)); - Send_Trig_Out(); + if (step_changed) { step_changed=0; + SR.ShiftOut_Update(temp_step_led,((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll)); + Send_Trig_Out((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll); + Set_CPU_Trig_High(); } - else{ + else { SR.ShiftOut_Update(temp_step_led,inst_roll); + //MODE ROLL + if (roll_mode && ppqn_count%(roll_scale[scale_type][roll_pointer]/4) == 0 && inst_roll>0) { + Send_Trig_Out(inst_roll); + Set_CPU_Trig_High(); + } } + //pdate le clignotements des leds if (tempo_led_count>=12) { tempo_led_count=0;//si le compteur egale un temps on le reinitialise @@ -203,9 +201,9 @@ ISR (PCINT3_vect) if(first_play){ MIDI_Send(0xfa);//Serial1.write(0xfa);//Midi Start ppqn_count=0; - PORTB |= 1<<2;//envoie une impulsion sur la sorti trig CPU a chaque pas + Set_CPU_Trig_High(); SR.ShiftOut_Update(temp_step_led,inst_step_buffer[0][pattern_buffer]&(~inst_mute)); - Send_Trig_Out(); + Send_Trig_Out(inst_step_buffer[0][pattern_buffer]&(~inst_mute)); first_play=0; } MIDI_Send(0xf8);//Serial1.write (0xf8);//MIDI CLOCK Tick @@ -238,7 +236,7 @@ ISR (PCINT3_vect) } } step_changed=1;//flag que le pas a change - PORTB |= 1<<2;//envoie une impulsion sur la sorti trig CPU a chaque pas + //Set_CPU_Trig_High(); if(step_count>=nbr_step[pattern_buffer]){ step_count=0; if(load_pattern_ok){ @@ -271,6 +269,12 @@ ISR (PCINT3_vect) tempo_led_flag=!tempo_led_flag;//on alterne la valeur du flag de la led tempo. } } + + for (int tempx=0; tempx<500; tempx++) + { + }//tempo pour que la pulse CPU soit egal a 1ms + + Set_CPU_Trig_Low(); } void MIDI_Send(byte OutByte) diff --git a/Yocto/Main_Loop.ino b/Yocto/Main_Loop.ino index 5ee6897..0266e76 100644 --- a/Yocto/Main_Loop.ino +++ b/Yocto/Main_Loop.ino @@ -81,7 +81,7 @@ void loop(){ if(play){ play=0; MIDI_Send(0xfc);//envoi un stop midi (send a MIDI stop) - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } } @@ -103,7 +103,7 @@ void loop(){ if(play){ play=0; MIDI_Send(0xfc);//envoi un stop midi (send a MIDI stop) - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } } @@ -133,7 +133,7 @@ void loop(){ if(play){ play=0; MIDI_Send(0xfc);//envoi un stop midi (send a MIDI stop) - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } } @@ -161,7 +161,7 @@ void loop(){ if(play){ play=0; MIDI_Send(0xfc);//envoi un stop midi - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } } @@ -188,7 +188,7 @@ void loop(){ if(play){ play=0; MIDI_Send(0xfc);//envoi un stop midi (send a MIDI stop) - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } //TapeTempoInit(); @@ -214,7 +214,7 @@ void loop(){ if(play){ play=0; MIDI_Send(0xfc);//envoi un stop midi (send a MIDI stop) - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } TapeTempoInit(); @@ -240,7 +240,7 @@ void loop(){ if(play){ play=0; MIDI_Send(0xfc);//envoi un stop midi (send a MIDI stop) - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } } @@ -263,7 +263,7 @@ void loop(){ if(play){ play=0; MIDI_Send(0xfc);//envoi un stop midi - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } MIDI.setHandleClock(Handle_Clock);// Callback Clock MIDI @@ -296,7 +296,7 @@ void loop(){ if(play) { play=0; MIDI_Send(0xfc);//envoi un stop midi - PORTD &= ~(1<<5);//met au niveau bas la sorti DIN start =>STOP + Set_Dinsync_Run_Low(); button_play_count=0; } //initialise les leds suivant le channel selectionner et les sortie des instru a 0 @@ -358,9 +358,9 @@ void loop(){ // SR.ShiftOut_Update(temp_step_led,inst_midi_buffer); - PORTB |= (1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas + Set_CPU_Trig_High(); delayMicroseconds(10); - PORTB &= ~(1<<2); + Set_CPU_Trig_Low(); Send_Trig_Out_Midi(); diff --git a/Yocto/Midi_Play.ino b/Yocto/Midi_Play.ino index 2ec6695..13dde00 100644 --- a/Yocto/Midi_Play.ino +++ b/Yocto/Midi_Play.ino @@ -1,44 +1,5 @@ #define NOTE_ON 0x90 //note on sur canal 1 -///////////////////////////////////////////////////////////////////////////////// -//Interruption midi en mode midi play -// ce qui est different de l interruption en mode pattern play c'est -//que le shift register des inst est update suivant la note midi recu -///////////////////////////////////////////////////////////////////////////////// -/*void Midi_Synchro_Midi_Play(){ - - if(Serial1.available()>0){ - byte data; - data = Serial1.read();//enregistre le byte recu dans la variable data - Serial1.write(data);//echo vers la sorti MIDI OUT de l'entrée MIDI - switch (data){ - - //MIDI START - case 0xfa: - PORTD |= (1<<5);// met au niveau haut le sorti Din start - play=1; - ppqn_count=0; - first_play=1; - break; - - //MIDI STOP - case 0xfc: - PORTD&=~(1<<5);//met a 0 la sorti DIN start - play=0; - step_count=0; - break; - - //MIDI CLOCK - case 0xf8: - PORTD|=(1<<4);//met a 1 la clock DIN - delayMicroseconds (2000);//delay neccessaire pour que le cycle de la clock soit correct en DIN_CLK - PORTD&=~(1<<4);//met a o la clock DIN - break; - - } - } - }*/ - void Handle_NoteOn(byte channel, byte pitch, byte velocity) { if (velocity == 0){ @@ -84,7 +45,7 @@ void Handle_NoteOff(byte channel, byte pitch, byte velocity) { void Handle_Start() { - PORTD |= (1<<5);// met au niveau haut le sorti Din start + Set_Dinsync_Run_High(); play = 1; ppqn_count = 0; first_play = 1; @@ -92,10 +53,10 @@ void Handle_Start() { void Handle_Stop() { - PORTD &= ~(1<<5);//met a 0 la sorti DIN start + Set_Dinsync_Run_Low(); play = 0; step_count = 0; - PORTB &= ~(1<<2);// met a 0 la sorti TRIG CPU + Set_CPU_Trig_Low(); } @@ -103,54 +64,55 @@ void Handle_Clock() { Reset_Trig_Out(); if (first_play) { - // Old dinsync devices have problems if the the CLK comes too quickly after RUN. + // Old dinsync devices have problems if the CLK comes too quickly after RUN. // Therefor we delay it with Timer3 for 2ms. dinsync_first_clock_timeout = 2; } else { Set_Dinsync_Clock_High(); } - - - //bitWrite(PORTD,4,!(bitRead (PIND,4))); - //PORTB &= ~(1<<2);// met a 0 la sorti TRIG CPU - //MODE ROLL - if(roll_mode && ppqn_count%(roll_scale[scale_type][roll_pointer]/4) == 0 && inst_roll>0) { - PORTB |= (1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas - //SR.ShiftOut_Update(temp_step_led,inst_roll); - //Send_Trig_Out(); + if (step_changed) { + step_changed=0; + SR.ShiftOut_Update(temp_step_led,((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll)); + Send_Trig_Out((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll); + Set_CPU_Trig_High(); } - if(step_changed) { - SR.ShiftOut_Update(temp_step_led,((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll)); - Send_Trig_Out(); - step_changed = 0; - PORTB |= (1<<2);//envoie une impulsion sur la sorti trig CPU a chaque pas - } - else if (!first_play) { + else { + if (!first_play) { SR.ShiftOut_Update(temp_step_led,inst_roll); + } + //MODE ROLL + if (roll_mode && ppqn_count%(roll_scale[scale_type][roll_pointer]/4) == 0 && inst_roll>0) { + Send_Trig_Out(inst_roll); + Set_CPU_Trig_High(); + } } ppqn_count++; tempo_led_count++; //PLAY================================================================= - if(play) { - //Update clignotement des leds + if (play) { + // Led handling. if (tempo_led_count >= 12) { - tempo_led_count = 0;//si le compteur egale un temps on le reinitialise - tempo_led_flag_block =! tempo_led_flag_block;//clignote au tempo + tempo_led_count = 0; // Re-initialize the flag. + tempo_led_flag_block =! tempo_led_flag_block; // Blink with tempo. + } + if (ppqn_count >= 3) { + tempo_led_flag = 0; // We alternate the flag of the tempo LED. + } + else { + tempo_led_flag = 1; } - if(ppqn_count >= 3) tempo_led_flag = 0;//on alterne la valeur du flag de la led tempo. - else tempo_led_flag = 1; if (first_play) { - //ppqn_count = 0; //initialise le compteur PPQN - PORTB |= 1<<2; //envoie une impulsion sur la sorti trig CPU a chaque pas + first_play = 0; // Re-initialize the flag. SR.ShiftOut_Update(temp_step_led,((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll)); - Send_Trig_Out(); - first_play = 0; //initialise le flag + Send_Trig_Out((inst_step_buffer[step_count][pattern_buffer])&(~inst_mute)|inst_roll); + Set_CPU_Trig_High(); } + if (ppqn_count >= pattern_scale[pattern_buffer]/4) { ppqn_count = 0; step_count++; @@ -198,7 +160,7 @@ void Handle_Clock() { pattern_count = 0; //reinitilise le compteur de position du song } } - PORTB &= ~(1<<2); // met a 0 la sorti TRIG CPU + Set_CPU_Trig_Low(); } @@ -235,7 +197,7 @@ void Disconnect_Callback() { DDRD |= (1<<6);//sortie trig out inst_midi_buffer=0; SR.ShiftOut_Update(temp_step_led,inst_midi_buffer); - PORTB &=~1<<2; + Set_CPU_Trig_Low(); */ PORTC &= ~(B11111100);//clear les edits leds dans ce mode SR.Led_Step_Write(0);//tous les leds Step Off diff --git a/Yocto/Mode_Pattern.ino b/Yocto/Mode_Pattern.ino index 35a3e7b..76889c8 100644 --- a/Yocto/Mode_Pattern.ino +++ b/Yocto/Mode_Pattern.ino @@ -296,9 +296,9 @@ void Mode_Pattern(){ // However in practice this usually does not work. Double triggers are better than no // triggers at all, so we go for the possible double trigger for now: SR.Inst_Send(1<