From: Andrei S. <and...@gm...> - 2011-07-07 17:17:49
|
Thank you for the release, Some time ago I suggested saving track quantization, but now I realized that my post did never make it to the list, probably because of the file I attached. So I am repeating it here without the attachment. If you find the feature I implemented useful, I hope it could be included into the next release. Current track quantization defaults to 1/16. And even when I set it to, say, 1/12, it still shows 1/16, after I load the project next time. So, if I write a composition in 3/4, I have to reset the quantization of each track to 1/12 each time, and if I forget then copy-n-paste and other editing operations modify all quantizations to 1/16, essentially corrupting the track score. Then I have to correct it back manually, which can be frustrating. I found it inconvenient to reset it to 1/12 every time I load the project. So, I made a quick fix to save the quantization value in the project file. In my implementation the quantization value is saved independently for each Instrument Track. Here is the git-diff on the 4_12 branch: diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 57e8ffb..1d6e797 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -188,6 +188,10 @@ public: return &m_effectChannelModel; } + IntModel * quantizeModel() + { + return &m_quantizeModel; + } signals: void instrumentChanged(); @@ -224,6 +228,7 @@ private: FloatModel m_panningModel; FloatModel m_pitchModel; IntModel m_effectChannelModel; + IntModel m_quantizeModel; Instrument * m_instrument; diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index e81c657..531e08a 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -590,6 +590,9 @@ void pianoRoll::setCurrentPattern( pattern * _new_pattern ) NumOctaves * KeysPerOctave ); } } + + m_quantizeModel.setValue(m_pattern->instrumentTrack()->quantizeModel()->value()); + // resizeEvent() does the rest for us (scrolling, range-checking // of start-notes and so on...) resizeEvent( NULL ); @@ -1153,6 +1156,7 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke ) else if( _ke->modifiers() & Qt::AltModifier ) { m_quantizeModel.setValue( len ); + m_pattern->instrumentTrack()->quantizeModel()->setValue( len ); _ke->accept(); } break; @@ -3503,7 +3507,18 @@ void pianoRoll::quantizeChanged() if( m_quantizeModel.value() == 0 && m_noteLenModel.value() == 0 ) { - m_quantizeModel.setValue( m_quantizeModel.findText( "1/16" ) ); + if (m_pattern != NULL) + m_quantizeModel.setValue( + m_pattern->instrumentTrack()->quantizeModel()->value() + ); + else + m_quantizeModel.setValue( m_quantizeModel.findText( "1/16" ) ); + return; + } else { + if (m_pattern != NULL) + m_pattern->instrumentTrack()->quantizeModel()->setValue( + m_quantizeModel.value() + ); return; } // Could be smarter diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 59b4f74..a781f3c 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -106,6 +106,7 @@ InstrumentTrack::InstrumentTrack( trackContainer * _tc ) : this, tr( "Panning" ) ), m_pitchModel( 0, -100, 100, 1, this, tr( "Pitch" ) ), m_effectChannelModel( 0, 0, NumFxChannels, this, tr( "FX channel" ) ), + m_quantizeModel( 5, 0, 13, this, tr( "Quantize" ) ), m_instrument( NULL ), m_soundShaping( this ), m_arpeggiator( this ), @@ -715,6 +716,7 @@ void InstrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, m_pitchModel.saveSettings( _doc, _this, "pitch" ); m_effectChannelModel.saveSettings( _doc, _this, "fxch" ); + m_quantizeModel.saveSettings( _doc, _this, "quant" ); m_baseNoteModel.saveSettings( _doc, _this, "basenote" ); if( m_instrument != NULL ) @@ -758,6 +760,11 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_pitchModel.loadSettings( _this, "pitch" ); m_effectChannelModel.loadSettings( _this, "fxch" ); + + if ( _this.hasAttribute( "quant" ) ) + { + m_quantizeModel.loadSettings( _this, "quant" ); + } if( _this.hasAttribute( "baseoct" ) ) { -- Andrei |
From: Andrei S. <and...@gm...> - 2011-07-07 18:36:11
|
Thank you for the release, Here is one feature I would suggest, and the implementation of which is provided below. Current track quantization defaults to 1/16. And even when I set it to, say, 1/12, it still shows 1/16, after I load the project next time. So, if I write a composition in 3/4, I have to reset the quantization of each track to 1/12 each time, and if I forget then copy-n-paste and other editing operations modify all quantizations to 1/16, essentially corrupting the track score. Then I have to correct it back manually, which can be frustrating. I found it inconvenient to reset it to 1/12 every time I load the project. So, I made a quick fix to save the quantization value in the project file. In my implementation the quantization value is saved independently for each Instrument Track. Here is the git-diff on the 4_12 branch: diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 57e8ffb..1d6e797 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -188,6 +188,10 @@ public: return &m_effectChannelModel; } + IntModel * quantizeModel() + { + return &m_quantizeModel; + } signals: void instrumentChanged(); @@ -224,6 +228,7 @@ private: FloatModel m_panningModel; FloatModel m_pitchModel; IntModel m_effectChannelModel; + IntModel m_quantizeModel; Instrument * m_instrument; diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index e81c657..531e08a 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -590,6 +590,9 @@ void pianoRoll::setCurrentPattern( pattern * _new_pattern ) NumOctaves * KeysPerOctave ); } } + + m_quantizeModel.setValue(m_pattern->instrumentTrack()->quantizeModel()->value()); + // resizeEvent() does the rest for us (scrolling, range-checking // of start-notes and so on...) resizeEvent( NULL ); @@ -1153,6 +1156,7 @@ void pianoRoll::keyPressEvent( QKeyEvent * _ke ) else if( _ke->modifiers() & Qt::AltModifier ) { m_quantizeModel.setValue( len ); + m_pattern->instrumentTrack()->quantizeModel()->setValue( len ); _ke->accept(); } break; @@ -3503,7 +3507,18 @@ void pianoRoll::quantizeChanged() if( m_quantizeModel.value() == 0 && m_noteLenModel.value() == 0 ) { - m_quantizeModel.setValue( m_quantizeModel.findText( "1/16" ) ); + if (m_pattern != NULL) + m_quantizeModel.setValue( + m_pattern->instrumentTrack()->quantizeModel()->value() + ); + else + m_quantizeModel.setValue( m_quantizeModel.findText( "1/16" ) ); + return; + } else { + if (m_pattern != NULL) + m_pattern->instrumentTrack()->quantizeModel()->setValue( + m_quantizeModel.value() + ); return; } // Could be smarter diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index 59b4f74..a781f3c 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -106,6 +106,7 @@ InstrumentTrack::InstrumentTrack( trackContainer * _tc ) : this, tr( "Panning" ) ), m_pitchModel( 0, -100, 100, 1, this, tr( "Pitch" ) ), m_effectChannelModel( 0, 0, NumFxChannels, this, tr( "FX channel" ) ), + m_quantizeModel( 5, 0, 13, this, tr( "Quantize" ) ), m_instrument( NULL ), m_soundShaping( this ), m_arpeggiator( this ), @@ -715,6 +716,7 @@ void InstrumentTrack::saveTrackSpecificSettings( QDomDocument & _doc, m_pitchModel.saveSettings( _doc, _this, "pitch" ); m_effectChannelModel.saveSettings( _doc, _this, "fxch" ); + m_quantizeModel.saveSettings( _doc, _this, "quant" ); m_baseNoteModel.saveSettings( _doc, _this, "basenote" ); if( m_instrument != NULL ) @@ -758,6 +760,11 @@ void InstrumentTrack::loadTrackSpecificSettings( const QDomElement & _this ) m_pitchModel.loadSettings( _this, "pitch" ); m_effectChannelModel.loadSettings( _this, "fxch" ); + + if ( _this.hasAttribute( "quant" ) ) + { + m_quantizeModel.loadSettings( _this, "quant" ); + } if( _this.hasAttribute( "baseoct" ) ) { -- Andrei |