summaryrefslogtreecommitdiff
path: root/muse2/muse/functions.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/functions.cpp')
-rw-r--r--muse2/muse/functions.cpp199
1 files changed, 112 insertions, 87 deletions
diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp
index 980a5103..6a3af374 100644
--- a/muse2/muse/functions.cpp
+++ b/muse2/muse/functions.cpp
@@ -54,6 +54,20 @@ bool is_relevant(const Event& event, const Part* part, int range)
}
}
+
+map<Event*, Part*> get_events(const set<Part*>& parts, int range)
+{
+ map<Event*, Part*> events;
+
+ for (set<Part*>::iterator part=parts.begin(); part!=parts.end(); part++)
+ for (iEvent event=(*part)->events()->begin(); event!=(*part)->events()->end(); event++)
+ if (is_relevant(event->second, *part, range))
+ events.insert(pair<Event*, Part*>(&event->second, *part));
+
+ return events;
+}
+
+
bool modify_notelen(const set<Part*>& parts)
{
if (!gatetime_dialog->exec())
@@ -89,78 +103,72 @@ bool quantize_notes(const set<Part*>& parts)
void modify_velocity(const set<Part*>& parts, int range, int rate, int offset)
{
- map<Event*, Part*> events;
-
- for (set<Part*>::iterator part=parts.begin(); part!=parts.end(); part++)
- for (iEvent event=(*part)->events()->begin(); event!=(*part)->events()->end(); event++)
- if (is_relevant(event->second, *part, range))
- events.insert(pair<Event*, Part*>(&event->second, *part));
-
-
- song->startUndo();
+ map<Event*, Part*> events = get_events(parts, range);
- for (map<Event*, Part*>::iterator it=events.begin(); it!=events.end(); it++)
+ if (!events.empty())
{
- Event& event=*(it->first);
- Part* part=it->second;
+ song->startUndo();
- int velo = event.velo();
+ for (map<Event*, Part*>::iterator it=events.begin(); it!=events.end(); it++)
+ {
+ Event& event=*(it->first);
+ Part* part=it->second;
+
+ int velo = event.velo();
- velo = (velo * rate) / 100;
- velo += offset;
+ velo = (velo * rate) / 100;
+ velo += offset;
- if (velo <= 0)
- velo = 1;
- else if (velo > 127)
- velo = 127;
-
- if (event.velo() != velo)
- {
- Event newEvent = event.clone();
- newEvent.setVelo(velo);
- // Indicate no undo, and do not do port controller values and clone parts.
- audio->msgChangeEvent(event, newEvent, part, false, false, false);
+ if (velo <= 0)
+ velo = 1;
+ else if (velo > 127)
+ velo = 127;
+
+ if (event.velo() != velo)
+ {
+ Event newEvent = event.clone();
+ newEvent.setVelo(velo);
+ // Indicate no undo, and do not do port controller values and clone parts.
+ audio->msgChangeEvent(event, newEvent, part, false, false, false);
+ }
}
+
+ song->endUndo(SC_EVENT_MODIFIED);
}
-
- song->endUndo(SC_EVENT_MODIFIED);
}
void modify_notelen(const set<Part*>& parts, int range, int rate, int offset)
{
- map<Event*, Part*> events;
-
- for (set<Part*>::iterator part=parts.begin(); part!=parts.end(); part++)
- for (iEvent event=(*part)->events()->begin(); event!=(*part)->events()->end(); event++)
- if (is_relevant(event->second, *part, range))
- events.insert(pair<Event*, Part*>(&event->second, *part));
+ map<Event*, Part*> events = get_events(parts, range);
-
- song->startUndo();
-
- for (map<Event*, Part*>::iterator it=events.begin(); it!=events.end(); it++)
+ if (!events.empty())
{
- Event& event=*(it->first);
- Part* part=it->second;
+ song->startUndo();
+
+ for (map<Event*, Part*>::iterator it=events.begin(); it!=events.end(); it++)
+ {
+ Event& event=*(it->first);
+ Part* part=it->second;
- unsigned int len = event.lenTick(); //prevent compiler warning: comparison singed/unsigned
+ unsigned int len = event.lenTick(); //prevent compiler warning: comparison singed/unsigned
- len = (len * rate) / 100;
- len += offset;
+ len = (len * rate) / 100;
+ len += offset;
- if (len <= 0)
- len = 1;
-
- if (event.lenTick() != len)
- {
- Event newEvent = event.clone();
- newEvent.setLenTick(len);
- // Indicate no undo, and do not do port controller values and clone parts.
- audio->msgChangeEvent(event, newEvent, part, false, false, false);
+ if (len <= 0)
+ len = 1;
+
+ if (event.lenTick() != len)
+ {
+ Event newEvent = event.clone();
+ newEvent.setLenTick(len);
+ // Indicate no undo, and do not do port controller values and clone parts.
+ audio->msgChangeEvent(event, newEvent, part, false, false, false);
+ }
}
+
+ song->endUndo(SC_EVENT_MODIFIED);
}
-
- song->endUndo(SC_EVENT_MODIFIED);
}
unsigned quantize_tick(unsigned tick, unsigned raster, int swing)
@@ -187,51 +195,68 @@ unsigned quantize_tick(unsigned tick, unsigned raster, int swing)
void quantize_notes(const set<Part*>& parts, int range, int raster, int strength, int swing, int threshold)
{
- map<Event*, Part*> events;
-
- for (set<Part*>::iterator part=parts.begin(); part!=parts.end(); part++)
- for (iEvent event=(*part)->events()->begin(); event!=(*part)->events()->end(); event++)
- if (is_relevant(event->second, *part, range))
- events.insert(pair<Event*, Part*>(&event->second, *part));
-
-
- song->startUndo();
+ map<Event*, Part*> events = get_events(parts, range);
- for (map<Event*, Part*>::iterator it=events.begin(); it!=events.end(); it++)
+ if (!events.empty())
{
- Event& event=*(it->first);
- Part* part=it->second;
+ song->startUndo();
+
+ for (map<Event*, Part*>::iterator it=events.begin(); it!=events.end(); it++)
+ {
+ Event& event=*(it->first);
+ Part* part=it->second;
- unsigned begin_tick = event.tick() + part->tick();
- int begin_diff = quantize_tick(begin_tick, raster, swing) - begin_tick;
+ unsigned begin_tick = event.tick() + part->tick();
+ int begin_diff = quantize_tick(begin_tick, raster, swing) - begin_tick;
- if (abs(begin_diff) > threshold)
- begin_tick = begin_tick + begin_diff*strength/100;
+ if (abs(begin_diff) > threshold)
+ begin_tick = begin_tick + begin_diff*strength/100;
- unsigned len=event.lenTick();
-
- unsigned end_tick = begin_tick + len;
- int len_diff = quantize_tick(end_tick, raster, swing) - end_tick;
+ unsigned len=event.lenTick();
- if (abs(len_diff) > threshold)
- len = len + len_diff*strength/100;
+ unsigned end_tick = begin_tick + len;
+ int len_diff = quantize_tick(end_tick, raster, swing) - end_tick;
+
+ if (abs(len_diff) > threshold)
+ len = len + len_diff*strength/100;
- if (len <= 0)
- len = 1;
+ if (len <= 0)
+ len = 1;
-
- if ( (event.lenTick() != len) || (event.tick() + part->tick() != begin_tick) )
- {
- Event newEvent = event.clone();
- newEvent.setTick(begin_tick - part->tick());
- newEvent.setLenTick(len);
- // Indicate no undo, and do not do port controller values and clone parts.
- audio->msgChangeEvent(event, newEvent, part, false, false, false);
+
+ if ( (event.lenTick() != len) || (event.tick() + part->tick() != begin_tick) )
+ {
+ Event newEvent = event.clone();
+ newEvent.setTick(begin_tick - part->tick());
+ newEvent.setLenTick(len);
+ // Indicate no undo, and do not do port controller values and clone parts.
+ audio->msgChangeEvent(event, newEvent, part, false, false, false);
+ }
}
+
+ song->endUndo(SC_EVENT_MODIFIED);
}
+}
+
+void erase_notes(const set<Part*>& parts, int range)
+{
+ map<Event*, Part*> events = get_events(parts, range);
- song->endUndo(SC_EVENT_MODIFIED);
+ if (!events.empty())
+ {
+ song->startUndo();
+
+ for (map<Event*, Part*>::iterator it=events.begin(); it!=events.end(); it++)
+ {
+ Event& event=*(it->first);
+ Part* part=it->second;
+
+ audio->msgDeleteEvent(event, part, false, false, false);
+ }
+
+ song->endUndo(SC_EVENT_REMOVED);
+ }
}