* Revert "same note layering when sustain pedal is pressed (#3774)"
This reverts commit e387e77445.
* Fix recording of sustained notes
This commit is contained in:
@@ -237,6 +237,7 @@ private:
|
||||
MidiPort m_midiPort;
|
||||
|
||||
NotePlayHandle* m_notes[NumKeys];
|
||||
NotePlayHandleList m_sustainedNotes;
|
||||
|
||||
int m_runningMidiNotes[NumKeys];
|
||||
QMutex m_midiNotesMutex;
|
||||
|
||||
@@ -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
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user