summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2011-10-10 12:00:09 +0000
committerFlorian Jung <flo@windfisch.org>2011-10-10 12:00:09 +0000
commit182474fce42414f8f8c5545c4ce822aa5ce73c2c (patch)
tree72190d062480fdcedeb0079aeb269f3246731a6d
parent0e67ba1af056a0df0b6b01c70bb6cb12063479a8 (diff)
steprec and dlist-enote-changing fixes
steprec now works for new style drum tracks
-rw-r--r--muse2/muse/midiedit/dcanvas.cpp42
-rw-r--r--muse2/muse/midiedit/dlist.cpp34
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp11
-rw-r--r--muse2/muse/steprec.cpp9
-rw-r--r--muse2/muse/steprec.h2
5 files changed, 75 insertions, 23 deletions
diff --git a/muse2/muse/midiedit/dcanvas.cpp b/muse2/muse/midiedit/dcanvas.cpp
index 7daaff29..3431eabf 100644
--- a/muse2/muse/midiedit/dcanvas.cpp
+++ b/muse2/muse/midiedit/dcanvas.cpp
@@ -158,7 +158,8 @@ DrumCanvas::~DrumCanvas()
if (must_delete_our_drum_map && ourDrumMap!=NULL)
delete [] ourDrumMap;
- delete steprec;
+
+ delete steprec;
}
//---------------------------------------------------------
@@ -808,19 +809,22 @@ void DrumCanvas::dragLeaveEvent(QDragLeaveEvent*)
// keyPressed - called from DList
//---------------------------------------------------------
-void DrumCanvas::keyPressed(int index, int velocity) //FINDMICH later
+void DrumCanvas::keyPressed(int index, int velocity)
{
+ using MusECore::MidiTrack;
+
// called from DList - play event
- int port = ourDrumMap[index].port;
- int channel = ourDrumMap[index].channel;
- int pitch = ourDrumMap[index].anote;
+ int port = old_style_drummap_mode ? ourDrumMap[index].port : dynamic_cast<MidiTrack*>(*instrument_map[index].tracks.begin())->outPort();
+ int channel = old_style_drummap_mode ? ourDrumMap[index].channel : dynamic_cast<MidiTrack*>(*instrument_map[index].tracks.begin())->outChannel();
+ int pitch = old_style_drummap_mode ? ourDrumMap[index].anote : instrument_map[index].pitch;
// play note:
MusECore::MidiPlayEvent e(0, port, channel, 0x90, pitch, velocity);
MusEGlobal::audio->msgPlayMidiEvent(&e);
- if (_steprec && pos[0] >= start_tick /* && pos[0] < end_tick [removed by flo93: this is handled in steprec->record] */ && curPart)
- steprec->record(curPart,index,ourDrumMap[index].len,editor->raster(),velocity,MusEGlobal::globalKeyState&Qt::ControlModifier,MusEGlobal::globalKeyState&Qt::ShiftModifier);
+ if (_steprec && pos[0] >= start_tick /* && pos[0] < end_tick [removed by flo93: this is handled in steprec->record] */ &&
+ curPart && instrument_map[index].tracks.contains(curPart->track()) )
+ steprec->record(curPart,instrument_map[index].pitch,ourDrumMap[index].len,editor->raster(),velocity,MusEGlobal::globalKeyState&Qt::ControlModifier,MusEGlobal::globalKeyState&Qt::ShiftModifier, -1 /* invalid pitch as "really played" -> the "insert rest" feature is never triggered */);
}
@@ -828,12 +832,14 @@ void DrumCanvas::keyPressed(int index, int velocity) //FINDMICH later
// keyReleased
//---------------------------------------------------------
-void DrumCanvas::keyReleased(int index, bool) //FINDMICH later
+void DrumCanvas::keyReleased(int index, bool)
{
+ using MusECore::MidiTrack;
+
// called from DList - silence playing event
- int port = ourDrumMap[index].port;
- int channel = ourDrumMap[index].channel;
- int pitch = ourDrumMap[index].anote;
+ int port = old_style_drummap_mode ? ourDrumMap[index].port : dynamic_cast<MidiTrack*>(*instrument_map[index].tracks.begin())->outPort();
+ int channel = old_style_drummap_mode ? ourDrumMap[index].channel : dynamic_cast<MidiTrack*>(*instrument_map[index].tracks.begin())->outChannel();
+ int pitch = old_style_drummap_mode ? ourDrumMap[index].anote : instrument_map[index].pitch;
// release note:
MusECore::MidiPlayEvent e(0, port, channel, 0x90, pitch, 0);
@@ -1283,7 +1289,7 @@ void DrumCanvas::moveAwayUnused()
//---------------------------------------------------------
// midiNote
//---------------------------------------------------------
-void DrumCanvas::midiNote(int pitch, int velo) //FINDMICH later.
+void DrumCanvas::midiNote(int pitch, int velo)
{
if (debugMsg) printf("DrumCanvas::midiNote: pitch=%i, velo=%i\n", pitch, velo);
@@ -1291,7 +1297,17 @@ void DrumCanvas::midiNote(int pitch, int velo) //FINDMICH later.
&& !MusEGlobal::audio->isPlaying() && velo && pos[0] >= start_tick
/* && pos[0] < end_tick [removed by flo93: this is handled in steprec->record()] */
&& !(MusEGlobal::globalKeyState & Qt::AltModifier)) {
- steprec->record(curPart,MusEGlobal::drumInmap[pitch],ourDrumMap[(int)MusEGlobal::drumInmap[pitch]].len,editor->raster(),velo,MusEGlobal::globalKeyState&Qt::ControlModifier,MusEGlobal::globalKeyState&Qt::ShiftModifier);
+
+ int ourDrumMapSize=getOurDrumMapSize();
+ int i;
+ for (i=0;i<ourDrumMapSize;i++)
+ {
+ if ( instrument_map[i].tracks.contains(curPart->track()) && ourDrumMap[i].enote==pitch)
+ break;
+ }
+
+ if (i!=ourDrumMapSize)
+ steprec->record(curPart,instrument_map[i].pitch,ourDrumMap[i].len,editor->raster(),velo,MusEGlobal::globalKeyState&Qt::ControlModifier,MusEGlobal::globalKeyState&Qt::ShiftModifier, pitch);
}
}
diff --git a/muse2/muse/midiedit/dlist.cpp b/muse2/muse/midiedit/dlist.cpp
index 3399b78e..1d8436b6 100644
--- a/muse2/muse/midiedit/dlist.cpp
+++ b/muse2/muse/midiedit/dlist.cpp
@@ -372,8 +372,25 @@ void DList::viewMousePressEvent(QMouseEvent* ev)
//TODO: Set all the notes on the track with instrument=dm->enote to instrument=val
MusEGlobal::drumInmap[val] = instrument;
}
+ else
+ {
+ //Check if there is any other drumMap with the same inmap value (there should be one (and only one):-)
+ //If so, switch the inmap between the instruments
+ for (QSet<MusECore::Track*>::iterator it = dcanvas->get_instrument_map()[instrument].tracks.begin(); it!=dcanvas->get_instrument_map()[instrument].tracks.end(); it++)
+ {
+ MusECore::MidiTrack* mt = dynamic_cast<MusECore::MidiTrack*>(*it);
+ mt->drummap()[mt->map_drum_in(val)].enote=dm->enote;
+ }
+ // propagating this is unneccessary as it's already done.
+ // updating the drumInmap is unneccessary, as the propagate call below
+ // does this for us.
+ // updating ourDrumMap is unneccessary because the song->update(SC_DRUMMAP)
+ // does this for us.
+ }
+
dm->enote = val;
break;
+
case COL_NOTELENGTH:
val = dm->len + incVal;
if (val < 0)
@@ -844,7 +861,22 @@ void DList::pitchEdited()
}
//TODO: Set all the notes on the track with instrument=dm->enote to instrument=val
MusEGlobal::drumInmap[val] = instrument;
- }
+ }
+ else
+ {
+ //Check if there is any other drumMap with the same inmap value (there should be one (and only one):-)
+ //If so, switch the inmap between the instruments
+ for (QSet<MusECore::Track*>::iterator it = dcanvas->get_instrument_map()[instrument].tracks.begin(); it!=dcanvas->get_instrument_map()[instrument].tracks.end(); it++)
+ {
+ MusECore::MidiTrack* mt = dynamic_cast<MusECore::MidiTrack*>(*it);
+ mt->drummap()[mt->map_drum_in(val)].enote=editEntry->enote;
+ }
+ // propagating this is unneccessary as it's already done.
+ // updating the drumInmap is unneccessary, as the propagate call below
+ // does this for us.
+ // updating ourDrumMap is unneccessary because the song->update(SC_DRUMMAP)
+ // does this for us.
+ }
editEntry->enote = val;
break;
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index cf436465..5fa117f5 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -4592,8 +4592,11 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
* o arranger state and mixer state aren't stored (says tim)
* ? pasting in editors sometimes fails oO? ( ERROR: reading eventlist
* from clipboard failed. ignoring this one... ) [ not reproducible ]
- *
+ *
* CURRENT TODO
+ * o don't record muted/hidden instr.s
+ * o offer menu entry for hiding all unused / empty drum instruments
+ *
* o in appearance.cpp: add the new stuff for drumTrackLabelBg and drumTrackBg
* o find and fix FINDMICHJETZT
* o fix all segfaults and non-working stuff!
@@ -4603,9 +4606,6 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
* - recording/echoing/steprec them
* - load, save them
* o fix valgrind problems
- * x midi-import settings
- * o support or handle duplicate enotes somehow!
- * o steprec, test midi thru
*
* > o drum editor: channel-stuff
* o clearly state in the changelog: when having multiple drumeditors open,
@@ -4623,11 +4623,12 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
*
* x when playing back a flo-drum-track: treat as a MIDI track,
* EXCEPT that the drum list's mute entries are respected!
- * o when recording or echoing a flo-drum-track: watch out for In-Notes!
+ * x when recording or echoing a flo-drum-track: watch out for In-Notes!
* * update [midi]track::read/write, readproperties, writeprop... (drumlist etc), operator=
* _should_ be okay, but i'm not sure
*
* IMPORTANT TODO
+ * o allow steprec-insert-rest-note to be set to "off" / "unused"
* o all places where i added doubleclick-edits: only react on left-click double clicks!
* o support "new style" reordering with old style drum tracks as well
* (not swapping but inserting!)
diff --git a/muse2/muse/steprec.cpp b/muse2/muse/steprec.cpp
index ea3feae7..c07a5bb8 100644
--- a/muse2/muse/steprec.cpp
+++ b/muse2/muse/steprec.cpp
@@ -55,13 +55,16 @@ void StepRec::timeout()
}
}
-void StepRec::record(Part* part, int pitch, int len, int step, int velo, bool ctrl, bool shift)
+void StepRec::record(Part* part, int pitch, int len, int step, int velo, bool ctrl, bool shift, int incoming_pitch)
{
unsigned tick = MusEGlobal::song->cpos();
unsigned lasttick=0;
Undo operations;
- if (pitch!=MusEGlobal::rcSteprecNote)
+ // if incoming_pitch wasn't specified, set it to pitch
+ if (incoming_pitch == 1337) incoming_pitch=pitch;
+
+ if (incoming_pitch!=MusEGlobal::rcSteprecNote)
{
chord_timer->stop();
@@ -132,7 +135,7 @@ void StepRec::record(Part* part, int pitch, int len, int step, int velo, bool ct
goto steprec_record_foot; // this is actually unneccessary, but for clarity
}
- else // equals if (pitch==MusEGlobal::rcSteprecNote)
+ else // equals if (incoming_pitch==MusEGlobal::rcSteprecNote)
{
bool held_notes=false;
if (note_held_down!=NULL)
diff --git a/muse2/muse/steprec.h b/muse2/muse/steprec.h
index ba42c49c..a82cab20 100644
--- a/muse2/muse/steprec.h
+++ b/muse2/muse/steprec.h
@@ -37,7 +37,7 @@ class StepRec : public QObject
public:
StepRec(bool* note_held_down_array);
- void record(Part* part, int pitch, int len, int step, int velo=80, bool ctrl=false, bool shift=false);
+ void record(Part* part, int recorded_pitch, int len, int step, int velo=80, bool ctrl=false, bool shift=false, int incoming_pitch=1337);
private slots:
void timeout();