diff options
| author | Florian Jung <flo@windfisch.org> | 2011-10-10 12:00:09 +0000 | 
|---|---|---|
| committer | Florian Jung <flo@windfisch.org> | 2011-10-10 12:00:09 +0000 | 
| commit | 182474fce42414f8f8c5545c4ce822aa5ce73c2c (patch) | |
| tree | 72190d062480fdcedeb0079aeb269f3246731a6d /muse2/muse | |
| parent | 0e67ba1af056a0df0b6b01c70bb6cb12063479a8 (diff) | |
steprec and dlist-enote-changing fixes
steprec now works for new style drum tracks
Diffstat (limited to 'muse2/muse')
| -rw-r--r-- | muse2/muse/midiedit/dcanvas.cpp | 42 | ||||
| -rw-r--r-- | muse2/muse/midiedit/dlist.cpp | 34 | ||||
| -rw-r--r-- | muse2/muse/midiedit/scoreedit.cpp | 11 | ||||
| -rw-r--r-- | muse2/muse/steprec.cpp | 9 | ||||
| -rw-r--r-- | muse2/muse/steprec.h | 2 | 
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(); | 
