1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html 2 3 #ifndef SPECTMORPH_SYNTH_INTERFACE_HH 4 #define SPECTMORPH_SYNTH_INTERFACE_HH 5 6 #include "smmidisynth.hh" 7 #include "smproject.hh" 8 namespace SpectMorph 9 { 10 11 class SynthInterface 12 { 13 Project *m_project = nullptr; 14 public: 15 SynthInterface (Project *project) 16 { 17 m_project = project; 18 } 19 Project * 20 get_project() 21 { 22 return m_project; 23 } 24 template<class DATA> 25 void 26 send_control_event (const std::function<void(Project *)>& func, DATA *data = nullptr) 27 { 28 m_project->synth_take_control_event (new InstFunc (func, [data]() { delete data;})); 29 } 30 void 31 send_control_event (const std::function<void(Project *)>& func) 32 { 33 m_project->synth_take_control_event (new InstFunc (func, []() {})); 34 } 35 void 36 synth_inst_edit_update (bool active, WavSet *take_wav_set, WavSet *take_ref_wav_set) 37 { 38 /* ownership of take_wav_set is transferred to the event */ 39 struct EventData 40 { 41 std::unique_ptr<WavSet> wav_set; 42 std::unique_ptr<WavSet> ref_wav_set; 43 } *event_data = new EventData; 44 45 event_data->wav_set.reset (take_wav_set); 46 event_data->ref_wav_set.reset (take_ref_wav_set); 47 48 send_control_event ( 49 [=] (Project *project) 50 { 51 project->midi_synth()->set_inst_edit (active); 52 53 if (active) 54 project->midi_synth()->inst_edit_synth()->take_wav_sets (event_data->wav_set.release(), event_data->ref_wav_set.release()); 55 }, 56 event_data); 57 } 58 void 59 synth_inst_edit_note (int note, bool on, unsigned int layer) 60 { 61 send_control_event ( 62 [=] (Project *project) 63 { 64 unsigned char event[3]; 65 66 event[0] = on ? 0x90 : 0x80; 67 event[1] = note; 68 event[2] = on ? 100 : 0; 69 70 project->midi_synth()->inst_edit_synth()->handle_midi_event (event, layer); 71 }); 72 } 73 void 74 emit_update_plan (MorphPlanPtr new_plan) 75 { 76 /* ownership of plan is transferred to the event */ 77 struct EventData 78 { 79 MorphPlanPtr plan; 80 } *event_data = new EventData; 81 82 // FIXME: refptr is locking (which is not too good) 83 event_data->plan = new_plan; 84 85 send_control_event ( 86 [=] (Project *project) 87 { 88 project->midi_synth()->update_plan (event_data->plan); 89 }, 90 event_data); 91 } 92 void 93 emit_update_gain (double gain) 94 { 95 send_control_event ( 96 [=] (Project *project) 97 { 98 project->midi_synth()->set_gain (gain); 99 }); 100 } 101 void 102 emit_add_rebuild_result (int object_id, WavSet *take_wav_set) 103 { 104 /* ownership of take_wav_set is transferred to the event */ 105 struct EventData 106 { 107 std::unique_ptr<WavSet> wav_set; 108 } *event_data = new EventData; 109 110 event_data->wav_set.reset (take_wav_set); 111 112 send_control_event ( 113 [=] (Project *project) 114 { 115 project->add_rebuild_result (object_id, event_data->wav_set.release()); 116 }, 117 event_data); 118 } 119 void 120 emit_clear_wav_sets() 121 { 122 send_control_event ( 123 [=] (Project *project) 124 { 125 project->clear_wav_sets(); 126 }); 127 } 128 Signal<SynthNotifyEvent *> signal_notify_event; 129 }; 130 131 } 132 133 #endif 134