Skip to content

Commit

Permalink
Fix recording of single streamed instruments(regression in #3774) (#3803
Browse files Browse the repository at this point in the history
)

* Revert "same note layering when sustain pedal is pressed (#3774)"

This reverts commit e387e77.

* Fix recording of sustained notes
  • Loading branch information
PhysSong authored and Umcaruje committed Sep 18, 2017
1 parent c0682c9 commit 4e3c6b0
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 11 deletions.
1 change: 1 addition & 0 deletions include/InstrumentTrack.h
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,7 @@ protected slots:
MidiPort m_midiPort;

NotePlayHandle* m_notes[NumKeys];
NotePlayHandleList m_sustainedNotes;

int m_runningMidiNotes[NumKeys];
QMutex m_midiNotesMutex;
Expand Down
21 changes: 11 additions & 10 deletions src/core/NotePlayHandle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,17 +252,8 @@ void NotePlayHandle::play( sampleFrame * _working_buffer )
if( m_released && (!instrumentTrack()->isSustainPedalPressed() ||
m_releaseStarted) )
{
if (m_releaseStarted == false)
{
m_releaseStarted = true;

if( m_origin == OriginMidiInput )
{
setLength( MidiTime( static_cast<f_cnt_t>( totalFramesPlayed() / Engine::framesPerTick() ) ) );
m_instrumentTrack->midiNoteOff( *this );
}

m_releaseStarted = true;
}
f_cnt_t todo = framesThisPeriod;

// if this note is base-note for arpeggio, always set
Expand Down Expand Up @@ -389,6 +380,16 @@ void NotePlayHandle::noteOff( const f_cnt_t _s )
MidiTime::fromFrames( _s, Engine::framesPerTick() ),
_s );
}

// inform attached components about MIDI finished (used for recording in Piano Roll)
if (!instrumentTrack()->isSustainPedalPressed())
{
if( m_origin == OriginMidiInput )
{
setLength( MidiTime( static_cast<f_cnt_t>( totalFramesPlayed() / Engine::framesPerTick() ) ) );
m_instrumentTrack->midiNoteOff( *this );
}
}
}


Expand Down
24 changes: 23 additions & 1 deletion src/tracks/InstrumentTrack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,12 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti
// be deleted later automatically)
Engine::mixer()->requestChangeInModel();
m_notes[event.key()]->noteOff( offset );
if (isSustainPedalPressed() &&
m_notes[event.key()]->origin() ==
m_notes[event.key()]->OriginMidiInput)
{
m_sustainedNotes << m_notes[event.key()];
}
m_notes[event.key()] = NULL;
Engine::mixer()->doneChangeInModel();
}
Expand Down Expand Up @@ -307,8 +313,24 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti
{
m_sustainPedalPressed = true;
}
else
else if (isSustainPedalPressed())
{
for (NotePlayHandle* nph : m_sustainedNotes)
{
if (nph && nph->isReleased())
{
if( nph->origin() ==
nph->OriginMidiInput)
{
nph->setLength(
MidiTime( static_cast<f_cnt_t>(
nph->totalFramesPlayed() /
Engine::framesPerTick() ) ) );
midiNoteOff( *nph );
}
}
}
m_sustainedNotes.clear();
m_sustainPedalPressed = false;
}
}
Expand Down

0 comments on commit 4e3c6b0

Please sign in to comment.