diff options
author | Florian Jung <flo@windfisch.org> | 2011-05-24 13:39:39 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2011-05-24 13:39:39 +0000 |
commit | 50e54c9b95c39badcd1f30443f30a74a7eb69ea3 (patch) | |
tree | 80c9cfa61cb4b9b76dc22f2774551258024d8224 /muse2/muse | |
parent | ef0aa8834d71587f7c417bb36d865ed1c8919a0b (diff) |
improved step recording and minor fixes
Diffstat (limited to 'muse2/muse')
-rw-r--r-- | muse2/muse/conf.cpp | 3 | ||||
-rw-r--r-- | muse2/muse/driver/jackmidi.cpp | 8 | ||||
-rw-r--r-- | muse2/muse/globals.cpp | 1 | ||||
-rw-r--r-- | muse2/muse/globals.h | 1 | ||||
-rw-r--r-- | muse2/muse/mididev.cpp | 10 | ||||
-rw-r--r-- | muse2/muse/midiedit/prcanvas.cpp | 72 | ||||
-rw-r--r-- | muse2/muse/midiedit/prcanvas.h | 2 | ||||
-rw-r--r-- | muse2/muse/mplugins/mrconfig.cpp | 7 | ||||
-rw-r--r-- | muse2/muse/mplugins/mrconfig.h | 1 | ||||
-rw-r--r-- | muse2/muse/mplugins/mrconfigbase.ui | 42 |
10 files changed, 124 insertions, 23 deletions
diff --git a/muse2/muse/conf.cpp b/muse2/muse/conf.cpp index e7eef503..56cbc321 100644 --- a/muse2/muse/conf.cpp +++ b/muse2/muse/conf.cpp @@ -481,6 +481,8 @@ static void readSeqConfiguration(Xml& xml) rcGotoLeftMarkNote = xml.parseInt(); else if (tag == "rcPlay") rcPlayNote = xml.parseInt(); + else if (tag == "rcSteprec") + rcSteprecNote = xml.parseInt(); else xml.unknown("Seq"); break; @@ -1061,6 +1063,7 @@ static void writeSeqConfiguration(int level, Xml& xml, bool writePortInfo) xml.intTag(level, "rcRecord", rcRecordNote); xml.intTag(level, "rcGotoLeft", rcGotoLeftMarkNote); xml.intTag(level, "rcPlay", rcPlayNote); + xml.intTag(level, "rcSteprec", rcSteprecNote); if (writePortInfo) { // diff --git a/muse2/muse/driver/jackmidi.cpp b/muse2/muse/driver/jackmidi.cpp index c950e096..1765fabb 100644 --- a/muse2/muse/driver/jackmidi.cpp +++ b/muse2/muse/driver/jackmidi.cpp @@ -974,13 +974,17 @@ void MidiJackDevice::recordEvent(MidiRecordEvent& event) } // - // transfer noteOn events to gui for step recording and keyboard - // remote control + // transfer noteOn and Off events to gui for step recording and keyboard + // remote control (changed by flo93: added noteOff-events) // if (typ == ME_NOTEON) { int pv = ((event.dataA() & 0xff)<<8) + (event.dataB() & 0xff); song->putEvent(pv); } + else if (typ == ME_NOTEOFF) { + int pv = ((event.dataA() & 0xff)<<8) + (0x00); //send an event with velo=0 + song->putEvent(pv); + } //if(_recordFifo.put(MidiPlayEvent(event))) // printf("MidiJackDevice::recordEvent: fifo overflow\n"); diff --git a/muse2/muse/globals.cpp b/muse2/muse/globals.cpp index f8ae4454..00c0f0a9 100644 --- a/muse2/muse/globals.cpp +++ b/muse2/muse/globals.cpp @@ -347,6 +347,7 @@ unsigned char rcStopNote = 28; unsigned char rcRecordNote = 31; unsigned char rcGotoLeftMarkNote = 33; unsigned char rcPlayNote = 29; +unsigned char rcSteprecNote = 36; bool automation = true; QObject* gRoutingPopupMenuMaster = 0; diff --git a/muse2/muse/globals.h b/muse2/muse/globals.h index 894f1baf..984571e2 100644 --- a/muse2/muse/globals.h +++ b/muse2/muse/globals.h @@ -167,6 +167,7 @@ extern unsigned char rcStopNote; extern unsigned char rcRecordNote; extern unsigned char rcGotoLeftMarkNote; extern unsigned char rcPlayNote; +extern unsigned char rcSteprecNote; extern bool midiSeqRunning; extern bool automation; diff --git a/muse2/muse/mididev.cpp b/muse2/muse/mididev.cpp index b5445b71..b13f571b 100644 --- a/muse2/muse/mididev.cpp +++ b/muse2/muse/mididev.cpp @@ -315,7 +315,7 @@ void MidiDevice::recordEvent(MidiRecordEvent& event) if (filterEvent(event, midiRecordType, false)) return; - + if (!applyMidiInputTransformation(event)) { if (midiInputTrace) printf(" midi input transformation: event filtered\n"); @@ -323,13 +323,17 @@ void MidiDevice::recordEvent(MidiRecordEvent& event) } // - // transfer noteOn events to gui for step recording and keyboard - // remote control + // transfer noteOn and Off events to gui for step recording and keyboard + // remote control (changed by flo93: added noteOff-events) // if (typ == ME_NOTEON) { int pv = ((event.dataA() & 0xff)<<8) + (event.dataB() & 0xff); song->putEvent(pv); } + else if (typ == ME_NOTEOFF) { + int pv = ((event.dataA() & 0xff)<<8) + (0x00); //send an event with velo=0 + song->putEvent(pv); + } ///if(_recBufFlipped) /// _recordEvents2.add(event); // add event to secondary list of recorded events diff --git a/muse2/muse/midiedit/prcanvas.cpp b/muse2/muse/midiedit/prcanvas.cpp index 1706681e..c9f66737 100644 --- a/muse2/muse/midiedit/prcanvas.cpp +++ b/muse2/muse/midiedit/prcanvas.cpp @@ -15,6 +15,8 @@ #include <QDropEvent> #include <QMouseEvent> +#include <set> + #include <values.h> #include <stdio.h> #include <math.h> @@ -84,6 +86,7 @@ PianoCanvas::PianoCanvas(MidiEditor* pr, QWidget* parent, int sx, int sy) colorMode = 0; playedPitch = -1; _steprec = false; + for (int i=0;i<128;i++) noteHeldDown[i]=false; chordTimer = new QTimer(this); chordTimer->setSingleShot(true); @@ -1053,13 +1056,30 @@ void PianoCanvas::cmd(int cmd) //--------------------------------------------------------- // midiNote //--------------------------------------------------------- - void PianoCanvas::midiNote(int pitch, int velo) { + if (debugMsg) printf("PianoCanvas::midiNote: pitch=%i, velo=%i\n", pitch, velo); + + if (velo) + noteHeldDown[pitch]=true; + else + noteHeldDown[pitch]=false; + + if (heavyDebugMsg) + { + printf(" held down notes are: "); + for (int i=0;i<128;i++) + if (noteHeldDown[i]) + printf("%i ",i); + printf("\n"); + } + if (_steprec && curPart && !audio->isPlaying() && velo && pos[0] >= start_tick && pos[0] < end_tick && !(globalKeyState & Qt::AltModifier)) { + + if (pitch!=rcSteprecNote) { chordTimer->stop(); //len has been changed by flo: set to raster() instead of quant() @@ -1128,6 +1148,56 @@ void PianoCanvas::midiNote(int pitch, int velo) chordTimer->start(); } } + else { // equals if (pitch==rcSteprecNote) + bool held_notes=false; + for (int i=0;i<128;i++) + if (noteHeldDown[i]) { held_notes=true; break; } + + if (held_notes) + { + chordTimer->stop(); + + unsigned tick = pos[0]; + + // extend len of last note(s) + using std::set; + + set<Event*> extend_set; + EventList* events = curPart->events(); + for (iEvent i = events->begin(); i != events->end(); ++i) { + Event& ev = i->second; + if (!ev.isNote()) + continue; + + if (noteHeldDown[ev.pitch()] && ((ev.tick() + ev.lenTick()) == tick)) + extend_set.insert(&ev); + } + for (set<Event*>::iterator it=extend_set.begin(); it!=extend_set.end(); it++) + { + Event& ev=**it; + Event e = ev.clone(); + e.setLenTick(ev.lenTick() + editor->rasterStep(tick)); + // Indicate do undo, and do not do port controller values and clone parts. + audio->msgChangeEvent(ev, e, curPart, true, false, false); + } + + if (! (globalKeyState & Qt::ShiftModifier)) { + chordTimer_setToTick = tick + editor->rasterStep(tick); + chordTimer->start(); + } + return; + + } + else // equals if (!held_notes) + { + chordTimer->stop(); + + //simply proceed, inserting a rest + Pos p(pos[0] + editor->rasterStep(pos[0]), true); + song->setPos(0, p, true, false, true); + } + } + } } void PianoCanvas::chordTimerTimedOut() diff --git a/muse2/muse/midiedit/prcanvas.h b/muse2/muse/midiedit/prcanvas.h index a5fea173..e90ac613 100644 --- a/muse2/muse/midiedit/prcanvas.h +++ b/muse2/muse/midiedit/prcanvas.h @@ -43,7 +43,7 @@ class PianoCanvas : public EventCanvas { QTimer* chordTimer; unsigned chordTimer_setToTick; - + bool noteHeldDown[128]; bool _steprec; Q_OBJECT diff --git a/muse2/muse/mplugins/mrconfig.cpp b/muse2/muse/mplugins/mrconfig.cpp index f64384af..1a55c826 100644 --- a/muse2/muse/mplugins/mrconfig.cpp +++ b/muse2/muse/mplugins/mrconfig.cpp @@ -26,12 +26,14 @@ MRConfig::MRConfig(QWidget* parent, Qt::WFlags fl) sb2->setValue(rcRecordNote); sb3->setValue(rcGotoLeftMarkNote); sb4->setValue(rcPlayNote); + steprec_box->setValue(rcSteprecNote); connect(b1, SIGNAL(toggled(bool)), SLOT(setRcEnable(bool))); connect(sb1, SIGNAL(valueChanged(int)), SLOT(setRcStopNote(int))); connect(sb2, SIGNAL(valueChanged(int)), SLOT(setRcRecordNote(int))); connect(sb3, SIGNAL(valueChanged(int)), SLOT(setRcGotoLeftMarkNote(int))); connect(sb4, SIGNAL(valueChanged(int)), SLOT(setRcPlayNote(int))); + connect(steprec_box, SIGNAL(valueChanged(int)), SLOT(setRcSteprecNote(int))); } //--------------------------------------------------------- @@ -69,3 +71,8 @@ void MRConfig::setRcPlayNote(int val) rcPlayNote = val; } +void MRConfig::setRcSteprecNote(int val) + { + rcSteprecNote = val; + } + diff --git a/muse2/muse/mplugins/mrconfig.h b/muse2/muse/mplugins/mrconfig.h index e829c15c..5e4b38af 100644 --- a/muse2/muse/mplugins/mrconfig.h +++ b/muse2/muse/mplugins/mrconfig.h @@ -32,6 +32,7 @@ class MRConfig : public QWidget, public Ui::MRConfigBase { void setRcRecordNote(int); void setRcGotoLeftMarkNote(int); void setRcPlayNote(int); + void setRcSteprecNote(int); public: MRConfig(QWidget* parent=0, Qt::WFlags fl = 0); diff --git a/muse2/muse/mplugins/mrconfigbase.ui b/muse2/muse/mplugins/mrconfigbase.ui index ed04c334..18050c78 100644 --- a/muse2/muse/mplugins/mrconfigbase.ui +++ b/muse2/muse/mplugins/mrconfigbase.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>298</width> - <height>249</height> + <height>267</height> </rect> </property> <property name="windowTitle"> @@ -95,19 +95,29 @@ </widget> </item> <item row="0" column="1"> - <widget class="PitchEdit" name="sb1" native="true"/> + <widget class="Awl::PitchEdit" name="sb1"/> </item> <item row="1" column="1"> - <widget class="PitchEdit" name="sb2" native="true"/> + <widget class="Awl::PitchEdit" name="sb2"/> </item> <item row="2" column="1"> - <widget class="PitchEdit" name="sb3" native="true"/> + <widget class="Awl::PitchEdit" name="sb3"/> </item> <item row="3" column="1"> - <widget class="PitchEdit" name="sb4" native="true"/> + <widget class="Awl::PitchEdit" name="sb4"/> </item> - <item row="0" column="2"> - <spacer name="Spacer1"> + <item row="4" column="1"> + <widget class="Awl::PitchEdit" name="steprec_box"/> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Insert rest (step rec) </string> + </property> + </widget> + </item> + <item row="3" column="2"> + <spacer name="Spacer4"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -122,8 +132,8 @@ </property> </spacer> </item> - <item row="1" column="2"> - <spacer name="Spacer2"> + <item row="2" column="2"> + <spacer name="Spacer3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -138,8 +148,8 @@ </property> </spacer> </item> - <item row="2" column="2"> - <spacer name="Spacer3"> + <item row="1" column="2"> + <spacer name="Spacer2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -154,8 +164,8 @@ </property> </spacer> </item> - <item row="3" column="2"> - <spacer name="Spacer4"> + <item row="0" column="2"> + <spacer name="Spacer1"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -178,9 +188,9 @@ <layoutdefault spacing="6" margin="11"/> <customwidgets> <customwidget> - <class>PitchEdit</class> - <extends>QWidget</extends> - <header>pitchedit.h</header> + <class>Awl::PitchEdit</class> + <extends>QSpinBox</extends> + <header>awl/pitchedit.h</header> </customwidget> </customwidgets> <includes> |