diff options
| author | Florian Jung <flo@windfisch.org> | 2011-05-23 12:27:43 +0000 | 
|---|---|---|
| committer | Florian Jung <flo@windfisch.org> | 2011-05-23 12:27:43 +0000 | 
| commit | cebe18a6c4211f23bc7cad82b4d9a9611a46234f (patch) | |
| tree | ce63faea8d1f544a013220b016f5b7f2b30c4a34 | |
| parent | 53a36a7047584ce0e66e00815c501f59cac2fa14 (diff) | |
the "remove" function now supports velo- and length-thresholds
| -rw-r--r-- | muse2/muse/functions.cpp | 11 | ||||
| -rw-r--r-- | muse2/muse/functions.h | 2 | ||||
| -rw-r--r-- | muse2/muse/midiedit/scoreedit.cpp | 8 | ||||
| -rw-r--r-- | muse2/muse/widgets/function_dialogs/remove.cpp | 20 | ||||
| -rw-r--r-- | muse2/muse/widgets/function_dialogs/remove.h | 4 | ||||
| -rw-r--r-- | muse2/muse/widgets/function_dialogs/removebase.ui | 129 | 
6 files changed, 162 insertions, 12 deletions
diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp index ba5f33c4..1ad81693 100644 --- a/muse2/muse/functions.cpp +++ b/muse2/muse/functions.cpp @@ -119,7 +119,8 @@ bool erase_notes(const set<Part*>& parts)  	if (!erase_dialog->exec())  		return false; -	erase_notes(parts,erase_dialog->range); +	erase_notes(parts,erase_dialog->range, erase_dialog->velo_threshold, erase_dialog->velo_thres_used,  +	                                       erase_dialog->len_threshold, erase_dialog->len_thres_used );  	return true;  } @@ -366,7 +367,7 @@ void quantize_notes(const set<Part*>& parts, int range, int raster, bool quant_l  	}  } -void erase_notes(const set<Part*>& parts, int range) +void erase_notes(const set<Part*>& parts, int range, int velo_threshold, bool velo_thres_used, int len_threshold, bool len_thres_used)  {  	map<Event*, Part*> events = get_events(parts, range); @@ -378,8 +379,10 @@ void erase_notes(const set<Part*>& parts, int range)  		{  			Event& event=*(it->first);  			Part* part=it->second; - -			audio->msgDeleteEvent(event, part, false, false, false); +			if ( (!velo_thres_used && !len_thres_used) || +			     (velo_thres_used && event.velo() < velo_threshold) || +			     (len_thres_used && int(event.lenTick()) < len_threshold) ) +				audio->msgDeleteEvent(event, part, false, false, false);  		}  		song->endUndo(SC_EVENT_REMOVED); diff --git a/muse2/muse/functions.h b/muse2/muse/functions.h index 4d7be6e2..18f6e3ec 100644 --- a/muse2/muse/functions.h +++ b/muse2/muse/functions.h @@ -43,7 +43,7 @@ void modify_velocity(const std::set<Part*>& parts, int range, int rate, int offs  void modify_off_velocity(const std::set<Part*>& parts, int range, int rate, int offset=0);  void modify_notelen(const std::set<Part*>& parts, int range, int rate, int offset=0);  void quantize_notes(const std::set<Part*>& parts, int range, int raster, bool len=false, int strength=100, int swing=0, int threshold=0); -void erase_notes(const std::set<Part*>& parts, int range); +void erase_notes(const std::set<Part*>& parts, int range, int velo_threshold=0, bool velo_thres_used=false, int len_threshold=0, bool len_thres_used=false);  void delete_overlaps(const std::set<Part*>& parts, int range);  void set_notelen(const std::set<Part*>& parts, int range, int len);  void move_notes(const std::set<Part*>& parts, int range, signed int ticks); diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp index b0e0eaf6..2636d4f2 100644 --- a/muse2/muse/midiedit/scoreedit.cpp +++ b/muse2/muse/midiedit/scoreedit.cpp @@ -4255,27 +4255,23 @@ void staff_t::apply_lasso(QRect rect, set<Event*>& already_processed)  /* BUGS and potential bugs - *   o quantize always quantizes length. make this selectable!   *   o when the keymap is not used, this will probably lead to a bug   *     same when mastertrack is disabled   *   o tied notes don't work properly when there's a key-change in   *     between, for example, when a cis is tied to a des   *    * CURRENT TODO - *   o drum list: scroll while dragging + *   o legato: extend length to next note   *    * IMPORTANT TODO   *   o do partial recalculating; recalculating can take pretty long   *     (0,5 sec) when displaying a whole song in scores   *   o transpose etc. must also transpose key-pressure events   *   o transpose: support in-key-transpose - *   o legato: extend length to next note - *   o delete: add velo and len threshold   *   o thin out: remove unneeded ctrl messages - *   o in drum roll: changing the list causes undo to be triggered, WTF? - *   o changing list is dead slow   *   * less important stuff + *   o drum list: scroll while dragging   *   o controller view in score editor   *   o quantize-templates (everything is forced into a specified   *                         rhythm) diff --git a/muse2/muse/widgets/function_dialogs/remove.cpp b/muse2/muse/widgets/function_dialogs/remove.cpp index 5ad272ab..4a875135 100644 --- a/muse2/muse/widgets/function_dialogs/remove.cpp +++ b/muse2/muse/widgets/function_dialogs/remove.cpp @@ -25,6 +25,10 @@ Remove::Remove(QWidget* parent)  void Remove::pull_values()  {  	range = range_group->checkedId(); +	len_thres_used=len_checkbox->isChecked(); +	len_threshold=len_spinbox->value(); +	velo_thres_used=velo_checkbox->isChecked(); +	velo_threshold=velo_spinbox->value();  }  void Remove::accept() @@ -38,6 +42,10 @@ int Remove::exec()  	if ((range < 0) || (range > 3)) range=0;  	range_group->button(range)->setChecked(true); +	len_checkbox->setChecked(len_thres_used); +	len_spinbox->setValue(len_threshold); +	velo_checkbox->setChecked(velo_thres_used); +	velo_spinbox->setValue(velo_threshold);  	return QDialog::exec();  } @@ -56,6 +64,14 @@ void Remove::read_configuration(Xml& xml)  			case Xml::TagStart:  				if (tag == "range")  					range=xml.parseInt(); +				else if (tag == "velo_threshold") +					velo_threshold=xml.parseInt(); +				else if (tag == "velo_thres_used") +					velo_thres_used=xml.parseInt(); +				else if (tag == "len_threshold") +					len_threshold=xml.parseInt(); +				else if (tag == "len_thres_used") +					len_thres_used=xml.parseInt();  				else  					xml.unknown("Erase");  				break; @@ -74,5 +90,9 @@ void Remove::write_configuration(int level, Xml& xml)  {  	xml.tag(level++, "erase");  	xml.intTag(level, "range", range); +	xml.intTag(level, "velo_threshold", velo_threshold); +	xml.intTag(level, "velo_thres_used", velo_thres_used); +	xml.intTag(level, "len_threshold", len_threshold); +	xml.intTag(level, "len_thres_used", len_thres_used);  	xml.tag(level, "/erase");  } diff --git a/muse2/muse/widgets/function_dialogs/remove.h b/muse2/muse/widgets/function_dialogs/remove.h index 5615ed42..4c1a91e9 100644 --- a/muse2/muse/widgets/function_dialogs/remove.h +++ b/muse2/muse/widgets/function_dialogs/remove.h @@ -27,6 +27,10 @@ class Remove : public QDialog, public Ui::RemoveBase  		Remove(QWidget* parent = 0);  		int range; +		int velo_threshold; +		bool velo_thres_used; +		int len_threshold; +		bool len_thres_used;  		void read_configuration(Xml& xml);  		void write_configuration(int level, Xml& xml); diff --git a/muse2/muse/widgets/function_dialogs/removebase.ui b/muse2/muse/widgets/function_dialogs/removebase.ui index 3381795c..79d541cc 100644 --- a/muse2/muse/widgets/function_dialogs/removebase.ui +++ b/muse2/muse/widgets/function_dialogs/removebase.ui @@ -10,7 +10,7 @@      <x>0</x>      <y>0</y>      <width>275</width> -    <height>195</height> +    <height>443</height>     </rect>    </property>    <property name="windowTitle"> @@ -70,6 +70,101 @@      </widget>     </item>     <item> +    <widget class="QGroupBox" name="groupBox_2"> +     <property name="title"> +      <string>Thresholds</string> +     </property> +     <property name="flat"> +      <bool>false</bool> +     </property> +     <property name="checkable"> +      <bool>false</bool> +     </property> +     <layout class="QGridLayout" name="gridLayout"> +      <property name="margin"> +       <number>11</number> +      </property> +      <property name="spacing"> +       <number>6</number> +      </property> +      <item row="0" column="1"> +       <widget class="QSpinBox" name="velo_spinbox"> +        <property name="enabled"> +         <bool>false</bool> +        </property> +        <property name="accelerated"> +         <bool>true</bool> +        </property> +        <property name="suffix"> +         <string/> +        </property> +        <property name="minimum"> +         <number>0</number> +        </property> +        <property name="maximum"> +         <number>127</number> +        </property> +        <property name="singleStep"> +         <number>1</number> +        </property> +        <property name="value"> +         <number>16</number> +        </property> +       </widget> +      </item> +      <item row="1" column="1"> +       <widget class="QSpinBox" name="len_spinbox"> +        <property name="enabled"> +         <bool>false</bool> +        </property> +        <property name="suffix"> +         <string> ticks</string> +        </property> +        <property name="maximum"> +         <number>10000</number> +        </property> +        <property name="value"> +         <number>12</number> +        </property> +       </widget> +      </item> +      <item row="0" column="0"> +       <widget class="QCheckBox" name="velo_checkbox"> +        <property name="text"> +         <string>Velocity</string> +        </property> +       </widget> +      </item> +      <item row="1" column="0"> +       <widget class="QCheckBox" name="len_checkbox"> +        <property name="text"> +         <string>Length</string> +        </property> +       </widget> +      </item> +      <item row="2" column="0" colspan="2"> +       <widget class="QLabel" name="label"> +        <property name="text"> +         <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:7px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If nothing is checked, everything is removed.</p> +<p style=" margin-top:0px; margin-bottom:7px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If velocity is checked, only notes with velo &lt; threshold are removed.</p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If both are checked, notes with velo &lt; threshold OR with length &lt; threshold are removed.</p></body></html></string> +        </property> +        <property name="textFormat"> +         <enum>Qt::AutoText</enum> +        </property> +        <property name="wordWrap"> +         <bool>true</bool> +        </property> +       </widget> +      </item> +     </layout> +    </widget> +   </item> +   <item>      <layout class="QHBoxLayout" name="horizontalLayout">       <property name="spacing">        <number>6</number> @@ -149,5 +244,37 @@      </hint>     </hints>    </connection> +  <connection> +   <sender>velo_checkbox</sender> +   <signal>toggled(bool)</signal> +   <receiver>velo_spinbox</receiver> +   <slot>setEnabled(bool)</slot> +   <hints> +    <hint type="sourcelabel"> +     <x>83</x> +     <y>192</y> +    </hint> +    <hint type="destinationlabel"> +     <x>198</x> +     <y>193</y> +    </hint> +   </hints> +  </connection> +  <connection> +   <sender>len_checkbox</sender> +   <signal>toggled(bool)</signal> +   <receiver>len_spinbox</receiver> +   <slot>setEnabled(bool)</slot> +   <hints> +    <hint type="sourcelabel"> +     <x>83</x> +     <y>221</y> +    </hint> +    <hint type="destinationlabel"> +     <x>198</x> +     <y>222</y> +    </hint> +   </hints> +  </connection>   </connections>  </ui>  | 
