Making MIDI Mappings persistent - Alex
[terminatorX.git] / terminatorX / src / tX_seqpar.cc
index f9e651a4761f90c6db98f17dc813fdc04ab5d846..833591155962519ae62151e7cc412bc18ae8f939 100644 (file)
@@ -46,6 +46,7 @@ void tX_seqpar :: default_constructor()
        max_value=0;
        min_value=0;
        scale_value=0;
+       is_boolean=false;
        is_mappable=1;
        all.push_back(this);
        last_event_recorded=NULL;
@@ -105,6 +106,40 @@ void tX_seqpar :: handle_mouse_input(float adjustment)
        receive_input_value(tmpvalue);
 }
 
+#ifdef USE_ALSA_MIDI_IN
+void tX_seqpar :: handle_midi_input( const tX_midievent& event )
+{
+       float tmpvalue = -1000;
+
+       //event.print( (string(__FUNCTION__) + " - " + get_name()).c_str() );
+       
+       if( !is_boolean )
+       {
+               if( event.type == tX_midievent::CC || event.type == tX_midievent::PITCHBEND )
+               {       
+                       tmpvalue = event.value * (max_value-min_value) + min_value;
+               }
+               else if( event.type == tX_midievent::NOTE )
+               {
+                       tmpvalue = event.is_noteon;
+               }
+               else
+               {
+                       return;
+               }
+
+               if (tmpvalue>max_value) tmpvalue=max_value;
+               if (tmpvalue<min_value) tmpvalue=min_value;
+       }
+       else
+       {
+               tmpvalue=event.value;
+       }
+               
+       receive_input_value(tmpvalue);
+}
+#endif
+
 void tX_seqpar :: set_vtt (void *mytt)
 {
        vtt=mytt;
@@ -150,7 +185,7 @@ void tX_seqpar :: create_persistence_ids()
        }
 }
 
-tX_seqpar* tX_seqpar :: get_sp_by_persistence_id(int pid)
+tX_seqpar* tX_seqpar :: get_sp_by_persistence_id(unsigned int pid)
 {
        list <tX_seqpar *> :: iterator sp;
        
@@ -219,6 +254,56 @@ char * tX_seqpar :: get_vtt_name()
         else return "Master Track";
 }
 
+void tX_seqpar :: restore_meta(xmlNodePtr node) {
+       char *buffer;
+       
+       buffer=(char *) xmlGetProp(node, (xmlChar *) "id");
+       if (buffer) { sscanf(buffer, "%i", &persistence_id); }
+       else { tX_error("no ID for seqpar %s", this->get_name()); }
+       
+       buffer=(char *) xmlGetProp(node, (xmlChar *) "midiType");
+       if (buffer) {
+               if (strcmp("cc", buffer)==0) {
+                       bound_midi_event.type=tX_midievent::CC;
+               } else if (strcmp("note", buffer)==0) {
+                       bound_midi_event.type=tX_midievent::NOTE;
+               } else if (strcmp("pitchbend", buffer)==0) {
+                       bound_midi_event.type=tX_midievent::PITCHBEND;
+               } else {
+                       tX_error("unknown midiType \"%s\" for seqpar %s", buffer, this->get_name());
+               }
+               
+               buffer=(char *) xmlGetProp(node, (xmlChar *) "midiChannel");
+               if (buffer) { sscanf(buffer, "%i", &bound_midi_event.channel); }
+               else { tX_error("no midiChannel for seqpar %s", this->get_name()); }
+                       
+               buffer=(char *) xmlGetProp(node, (xmlChar *) "midiNumber");
+               if (buffer) { sscanf(buffer, "%i", &bound_midi_event.number); }
+               else { tX_error("no midiNumber for seqpar %s", this->get_name()); }
+       } 
+       /* else: no MIDI init.... */
+}
+
+void tX_seqpar :: store_meta(FILE *output) {
+       char buffer[256];
+       
+       if (bound_midi_event.type!=tX_midievent::NONE) {
+               char *type;
+               
+               switch (bound_midi_event.type) {
+                       case tX_midievent::NOTE: type="note"; break;
+                       case tX_midievent::CC: type="cc"; break;
+                       case tX_midievent::PITCHBEND: type="pitchbend"; break;
+                       default: type="error";
+               }
+               sprintf(buffer, "id=\"%i\" midiType=\"%s\" midiChannel=\"%i\" midiNumber=\"%i\"", persistence_id, type, bound_midi_event.channel, bound_midi_event.number);
+       } else {
+               sprintf(buffer, "id=\"%i\"", persistence_id);
+       }
+       fprintf(output, buffer);
+}
+
+
 const char * tX_seqpar :: get_name()
 {
         return "This string means trouble!";
@@ -384,7 +469,7 @@ void tX_seqpar_vtt_speed :: handle_mouse_input(float adjustment)
 
 void tX_seqpar_vtt_speed :: do_exec(const float value)
 {
-       tt->speed=value;
+       tt->speed=value*tt->audiofile_pitch_correction;
 }
 
 const char * tX_seqpar_vtt_speed :: get_name()
@@ -486,7 +571,8 @@ const char * tX_seqpar_vtt_pitch :: get_name()
 
 tX_seqpar_vtt_trigger :: tX_seqpar_vtt_trigger()
 {
-       set_mapping_parameters(0, 0, 0, 0);
+       set_mapping_parameters(0.01, 0, 1, 1);
+       is_boolean=true;
 }
 
 void tX_seqpar_vtt_trigger :: do_exec(const float value)
@@ -505,6 +591,8 @@ const char * tX_seqpar_vtt_trigger :: get_name()
 tX_seqpar_vtt_loop :: tX_seqpar_vtt_loop()
 {
        set_mapping_parameters(0, 0, 0, 0);
+       
+       is_boolean=true;
 }
 
 void tX_seqpar_vtt_loop :: do_exec(const float value)
@@ -570,7 +658,8 @@ const char * tX_seqpar_vtt_sync_cycles :: get_name()
 
 tX_seqpar_vtt_lp_enable :: tX_seqpar_vtt_lp_enable()
 {
-       set_mapping_parameters(0,0,0,0);
+       set_mapping_parameters(0.01,0,1,1);
+       is_boolean=true;
 }
 
 void tX_seqpar_vtt_lp_enable :: do_exec(const float value)
@@ -640,7 +729,7 @@ const char * tX_seqpar_vtt_lp_reso :: get_name()
 
 tX_seqpar_vtt_lp_freq :: tX_seqpar_vtt_lp_freq()
 {
-       set_mapping_parameters(1.0, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
+       set_mapping_parameters(0.99, 0, TX_SEQPAR_DEFAULT_SCALE, 1);
 }
 
 float tX_seqpar_vtt_lp_freq :: get_value() { return tt->lp_freq; }
@@ -664,7 +753,8 @@ void tX_seqpar_vtt_lp_freq :: do_update_graphics ()
 
 tX_seqpar_vtt_ec_enable :: tX_seqpar_vtt_ec_enable()
 {
-       set_mapping_parameters(1.0, 0, 0, 0);
+       set_mapping_parameters(0.01,0,1,1);
+       is_boolean=true;
 }
 
 void tX_seqpar_vtt_ec_enable :: do_exec(const float value)
@@ -783,7 +873,8 @@ const char * tX_seqpar_vtt_ec_volume :: get_name()
 
 tX_seqpar_vtt_mute :: tX_seqpar_vtt_mute()
 {
-       set_mapping_parameters(0,0,0,0);
+       set_mapping_parameters(0.01,0,1,1);
+       is_boolean=true;
 }
 
 void tX_seqpar_vtt_mute :: do_exec(const float value)