diff options
26 files changed, 834 insertions, 431 deletions
diff --git a/muse2/muse/CMakeLists.txt b/muse2/muse/CMakeLists.txt index 2d2a9fe3..3117cf2f 100644 --- a/muse2/muse/CMakeLists.txt +++ b/muse2/muse/CMakeLists.txt @@ -89,6 +89,7 @@ file (GLOB core_source_files event.cpp eventlist.cpp exportmidi.cpp + functions.cpp gconfig.cpp globals.cpp help.cpp diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp index 052bb48b..7bf171e5 100644 --- a/muse2/muse/app.cpp +++ b/muse2/muse/app.cpp @@ -31,7 +31,6 @@ #include "didyouknow.h" #include "drumedit.h" #include "filedialog.h" -#include "gatetime.h" #include "gconfig.h" #include "gui.h" #include "icons.h" @@ -4184,8 +4183,7 @@ void MusE::transpose() void MusE::modifyGateTime() { - GateTime* w = new GateTime(this); - w->show(); + printf("not implemented\n"); } //--------------------------------------------------------- diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp new file mode 100644 index 00000000..980a5103 --- /dev/null +++ b/muse2/muse/functions.cpp @@ -0,0 +1,237 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: functions.cpp,v 1.20.2.19 2011/05/05 20:10 flo93 Exp $ +// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net) +//========================================================= + +#include "functions.h" +#include "song.h" + +#include "event.h" +#include "audio.h" +#include "gconfig.h" + +#include <iostream> + +using namespace std; + +GateTime* gatetime_dialog=NULL; +Velocity* velocity_dialog=NULL; +Quantize* quantize_dialog=NULL; + +void init_function_dialogs(QWidget* parent) +{ + gatetime_dialog = new GateTime(parent); + velocity_dialog = new Velocity(parent); + quantize_dialog = new Quantize(parent); +} + +set<Part*> partlist_to_set(PartList* pl) +{ + set<Part*> result; + + for (PartList::iterator it=pl->begin(); it!=pl->end(); it++) + result.insert(it->second); + + return result; +} + +bool is_relevant(const Event& event, const Part* part, int range) +{ + unsigned tick; + + if (event.type()!=Note) return false; + + switch (range) + { + case 0: return true; + case 1: return event.selected(); + case 2: tick=event.tick()+part->tick(); return (tick >= song->lpos()) && (tick < song->rpos()); + case 3: return is_relevant(event,part,1) && is_relevant(event,part,2); + default: cout << "ERROR: ILLEGAL FUNCTION CALL in is_relevant: range is illegal: "<<range<<endl; + return false; + } +} + +bool modify_notelen(const set<Part*>& parts) +{ + if (!gatetime_dialog->exec()) + return false; + + modify_notelen(parts,gatetime_dialog->range,gatetime_dialog->rateVal,gatetime_dialog->offsetVal); + + return true; +} + +bool modify_velocity(const set<Part*>& parts) +{ + if (!velocity_dialog->exec()) + return false; + + modify_velocity(parts,velocity_dialog->range,velocity_dialog->rateVal,velocity_dialog->offsetVal); + + return true; +} + +bool quantize_notes(const set<Part*>& parts) +{ + if (!quantize_dialog->exec()) + return false; + + quantize_notes(parts, quantize_dialog->range, (config.division*4)/(1<<quantize_dialog->raster_power2), + quantize_dialog->strength, quantize_dialog->swing, quantize_dialog->threshold); + + return true; +} + + + +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(); + + 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; + + 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); +} + +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)); + + + 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 + + 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); + } + } + + song->endUndo(SC_EVENT_MODIFIED); +} + +unsigned quantize_tick(unsigned tick, unsigned raster, int swing) +{ + //find out the nearest tick and the distance to it: + //this is so complicated because this function supports + //swing: if swing is 50, the resulting rhythm is not + //"daa daa daa daa" but "daaaa da daaaa da"... + int tick_dest1 = AL::sigmap.raster1(tick, raster*2); //round down + int tick_dest2 = tick_dest1 + raster + raster*swing/100; + int tick_dest3 = tick_dest1 + raster*2; + + int tick_diff1 = tick_dest1 - tick; + int tick_diff2 = tick_dest2 - tick; + int tick_diff3 = tick_dest3 - tick; + + if ((abs(tick_diff1) <= abs(tick_diff2)) && (abs(tick_diff1) <= abs(tick_diff3))) //tick_dest1 is the nearest tick + return tick_dest1; + else if ((abs(tick_diff2) <= abs(tick_diff1)) && (abs(tick_diff2) <= abs(tick_diff3))) //tick_dest2 is the nearest tick + return tick_dest2; + else + return tick_dest3; +} + +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(); + + 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; + + 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; + + if (abs(len_diff) > threshold) + len = len + len_diff*strength/100; + + 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); + } + } + + song->endUndo(SC_EVENT_MODIFIED); +} + + diff --git a/muse2/muse/functions.h b/muse2/muse/functions.h new file mode 100644 index 00000000..a71230a4 --- /dev/null +++ b/muse2/muse/functions.h @@ -0,0 +1,40 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: functions.h,v 1.20.2.19 2011/05/05 20:10 flo93 Exp $ +// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net) +//========================================================= + +#ifndef __FUNCTIONS_H__ +#define __FUNCTIONS_H__ + +#include "velocity.h" +#include "quantize.h" +#include "gatetime.h" + +#include <set> +#include "part.h" + + +extern GateTime* gatetime_dialog; +extern Velocity* velocity_dialog; +extern Quantize* quantize_dialog; + +void init_function_dialogs(QWidget* parent); + + +std::set<Part*> partlist_to_set(PartList* pl); + +//these functions simply do their job, non-interactively +void modify_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, int strength=100, int swing=0, int threshold=0); + +//the below functions automatically open the dialog +//they return true if you click "ok" and false if "abort" +bool modify_velocity(const std::set<Part*>& parts); +bool modify_notelen(const std::set<Part*>& parts); +bool quantize_notes(const std::set<Part*>& parts); + + +#endif diff --git a/muse2/muse/main.cpp b/muse2/muse/main.cpp index 53f8961b..6481f4cb 100644 --- a/muse2/muse/main.cpp +++ b/muse2/muse/main.cpp @@ -27,6 +27,7 @@ #include "globals.h" #include "icons.h" #include "sync.h" +#include "functions.h" extern bool initDummyAudio(); extern void initIcons(); @@ -470,6 +471,9 @@ int main(int argc, char* argv[]) muse = new MusE(argc, &argv[optind]); app.setMuse(muse); muse->setWindowIcon(*museIcon); + + init_function_dialogs(muse); + // Added by Tim. p3.3.22 if (!debugMode) { diff --git a/muse2/muse/midiedit/CMakeLists.txt b/muse2/muse/midiedit/CMakeLists.txt index 7e973aaa..a52d1844 100644 --- a/muse2/muse/midiedit/CMakeLists.txt +++ b/muse2/muse/midiedit/CMakeLists.txt @@ -35,7 +35,6 @@ QT4_WRAP_CPP ( midiedit_mocs piano.h pianoroll.h prcanvas.h - quantconfig.h scoreedit.h ) @@ -58,7 +57,6 @@ file (GLOB midiedit_source_files piano.cpp pianoroll.cpp prcanvas.cpp - quantconfig.cpp scoreedit.cpp ) diff --git a/muse2/muse/midiedit/dcanvas.cpp b/muse2/muse/midiedit/dcanvas.cpp index 1303c189..9c50c8b2 100644 --- a/muse2/muse/midiedit/dcanvas.cpp +++ b/muse2/muse/midiedit/dcanvas.cpp @@ -31,7 +31,6 @@ #include "globals.h" #include "midiport.h" #include "audio.h" -#include "velocity.h" #include "shortcuts.h" #include "icons.h" @@ -608,7 +607,7 @@ void DrumCanvas::drawCanvas(QPainter& p, const QRect& rect) //--------------------------------------------------------- // drawTopItem //--------------------------------------------------------- -void DrumCanvas::drawTopItem(QPainter &p, const QRect &r) +void DrumCanvas::drawTopItem(QPainter& p, const QRect&) { // draw cursor if (_tool == CursorTool) { @@ -819,52 +818,6 @@ void DrumCanvas::cmd(int cmd) song->setPos(0, p, true, true, true); //CDW } break; - case CMD_MODIFY_VELOCITY: - { - Velocity w; - w.setRange(0); //TODO: Make this work! Probably put _to & _toInit in ecanvas instead - if (!w.exec()) - break; - int range = w.range(); // all, selected, looped, sel+loop - int rate = w.rateVal(); - int offset = w.offsetVal(); - - song->startUndo(); - for (iCItem k = items.begin(); k != items.end(); ++k) { - DEvent* devent = (DEvent*)(k->second); - Event event = devent->event(); - if (event.type() != Note) - continue; - unsigned tick = event.tick(); - bool selected = k->second->isSelected(); - bool inLoop = (tick >= song->lpos()) && (tick < song->rpos()); - - if ((range == 0) - || (range == 1 && selected) - || (range == 2 && inLoop) - || (range == 3 && selected && inLoop)) { - int velo = event.velo(); - - //velo = rate ? (velo * 100) / rate : 64; - velo = (velo * rate) / 100; - velo += offset; - - if (velo <= 0) - velo = 1; - 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, devent->part(), false); - audio->msgChangeEvent(event, newEvent, devent->part(), false, false, false); - } - } - } - song->endUndo(SC_EVENT_MODIFIED); - } - break; } updateSelection(); redraw(); diff --git a/muse2/muse/midiedit/drumedit.cpp b/muse2/muse/midiedit/drumedit.cpp index ed3cd0e8..d9029969 100644 --- a/muse2/muse/midiedit/drumedit.cpp +++ b/muse2/muse/midiedit/drumedit.cpp @@ -43,6 +43,7 @@ #include "drummap.h" #include "audio.h" #include "gconfig.h" +#include "functions.h" /* static const char* map_file_pattern[] = { @@ -905,6 +906,9 @@ void DrumEdit::cmd(int cmd) case DrumCanvas::CMD_RESET: reset(); break; + case DrumCanvas::CMD_MODIFY_VELOCITY: + modify_velocity(partlist_to_set(parts())); + break; default: ((DrumCanvas*)(canvas))->cmd(cmd); break; diff --git a/muse2/muse/midiedit/pianoroll.cpp b/muse2/muse/midiedit/pianoroll.cpp index 2778d8b9..d008b35f 100644 --- a/muse2/muse/midiedit/pianoroll.cpp +++ b/muse2/muse/midiedit/pianoroll.cpp @@ -44,9 +44,10 @@ #include "gconfig.h" #include "icons.h" #include "audio.h" +#include "functions.h" + #include "cmd.h" -#include "quantconfig.h" #include "shortcuts.h" #include "mtrackinfo.h" @@ -77,7 +78,6 @@ PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned i deltaMode = false; resize(_widthInit, _heightInit); selPart = 0; - quantConfig = 0; _playEvents = false; _quantStrength = _quantStrengthInit; _quantLimit = _quantLimitInit; @@ -186,30 +186,11 @@ PianoRoll::PianoRoll(PartList* pl, QWidget* parent, const char* name, unsigned i menuFunctions->setTearOffEnabled(true); - funcOverQuantAction = menuFunctions->addAction(tr("Over Quantize")); - mapper->setMapping(funcOverQuantAction, PianoCanvas::CMD_OVER_QUANTIZE); - connect(funcOverQuantAction, SIGNAL(triggered()), mapper, SLOT(map())); - - funcNoteOnQuantAction = menuFunctions->addAction(tr("Note On Quantize")); - mapper->setMapping(funcNoteOnQuantAction, PianoCanvas::CMD_ON_QUANTIZE); - connect(funcNoteOnQuantAction, SIGNAL(triggered()), mapper, SLOT(map())); - - funcNoteOnOffQuantAction = menuFunctions->addAction(tr("Note On/Off Quantize")); - mapper->setMapping(funcNoteOnOffQuantAction, PianoCanvas::CMD_ONOFF_QUANTIZE); - connect(funcNoteOnOffQuantAction, SIGNAL(triggered()), mapper, SLOT(map())); - - funcIterQuantAction = menuFunctions->addAction(tr("Iterative Quantize")); - mapper->setMapping(funcIterQuantAction, PianoCanvas::CMD_ITERATIVE_QUANTIZE); - connect(funcIterQuantAction, SIGNAL(triggered()), mapper, SLOT(map())); + funcQuantizeAction = menuFunctions->addAction(tr("Quantize")); + mapper->setMapping(funcQuantizeAction, PianoCanvas::CMD_QUANTIZE); + connect(funcQuantizeAction, SIGNAL(triggered()), mapper, SLOT(map())); - menuFunctions->addSeparator(); - - funcConfigQuantAction = menuFunctions->addAction(tr("Config Quant...")); - connect(funcConfigQuantAction, SIGNAL(triggered()), this, SLOT(configQuant())); - - menuFunctions->addSeparator(); - - funcGateTimeAction = menuFunctions->addAction(tr("Modify Gate Time")); + funcGateTimeAction = menuFunctions->addAction(tr("Modify Note Length")); mapper->setMapping(funcGateTimeAction, PianoCanvas::CMD_MODIFY_GATE_TIME); connect(funcGateTimeAction, SIGNAL(triggered()), mapper, SLOT(map())); @@ -655,7 +636,14 @@ PianoRoll::~PianoRoll() void PianoRoll::cmd(int cmd) { - ((PianoCanvas*)canvas)->cmd(cmd, _quantStrength, _quantLimit, _quantLen, _to); + switch (cmd) + { + case PianoCanvas::CMD_MODIFY_GATE_TIME: modify_notelen(partlist_to_set(parts())); break; + case PianoCanvas::CMD_MODIFY_VELOCITY: modify_velocity(partlist_to_set(parts())); break; + case PianoCanvas::CMD_QUANTIZE: quantize_notes(partlist_to_set(parts())); break; + + default: ((PianoCanvas*)canvas)->cmd(cmd); + } } //--------------------------------------------------------- @@ -1201,21 +1189,6 @@ void PianoRoll::keyPressEvent(QKeyEvent* event) } //--------------------------------------------------------- -// configQuant -//--------------------------------------------------------- - -void PianoRoll::configQuant() - { - if (!quantConfig) { - quantConfig = new QuantConfig(_quantStrength, _quantLimit, _quantLen); - connect(quantConfig, SIGNAL(setQuantStrength(int)), SLOT(setQuantStrength(int))); - connect(quantConfig, SIGNAL(setQuantLimit(int)), SLOT(setQuantLimit(int))); - connect(quantConfig, SIGNAL(setQuantLen(bool)), SLOT(setQuantLen(bool))); - } - quantConfig->show(); - } - -//--------------------------------------------------------- // setSteprec //--------------------------------------------------------- @@ -1336,12 +1309,7 @@ void PianoRoll::initShortcuts() //evColorPitchAction->setShortcut(shortcuts[ ].key); //evColorVelAction->setShortcut(shortcuts[ ].key); - funcOverQuantAction->setShortcut(shortcuts[SHRT_OVER_QUANTIZE].key); - funcNoteOnQuantAction->setShortcut(shortcuts[SHRT_ON_QUANTIZE].key); - funcNoteOnOffQuantAction->setShortcut(shortcuts[SHRT_ONOFF_QUANTIZE].key); - funcIterQuantAction->setShortcut(shortcuts[SHRT_ITERATIVE_QUANTIZE].key); - - funcConfigQuantAction->setShortcut(shortcuts[SHRT_CONFIG_QUANT].key); + funcQuantizeAction->setShortcut(shortcuts[SHRT_OVER_QUANTIZE].key); //FINDMICH TODO FLO funcGateTimeAction->setShortcut(shortcuts[SHRT_MODIFY_GATE_TIME].key); funcModVelAction->setShortcut(shortcuts[SHRT_MODIFY_VELOCITY].key); diff --git a/muse2/muse/midiedit/pianoroll.h b/muse2/muse/midiedit/pianoroll.h index 2bfa9324..87bf52b6 100644 --- a/muse2/muse/midiedit/pianoroll.h +++ b/muse2/muse/midiedit/pianoroll.h @@ -35,7 +35,6 @@ class Splitter; class PartList; class Toolbar1; class Xml; -class QuantConfig; class ScrollScale; class Part; class SNode; @@ -81,11 +80,7 @@ class PianoRoll : public MidiEditor { QAction* evColorPitchAction; QAction* evColorVelAction; - QAction* funcOverQuantAction; - QAction* funcNoteOnQuantAction; - QAction* funcNoteOnOffQuantAction; - QAction* funcIterQuantAction; - QAction* funcConfigQuantAction; + QAction* funcQuantizeAction; QAction* funcGateTimeAction; QAction* funcModVelAction; QAction* funcCrescendoAction; @@ -137,7 +132,6 @@ class PianoRoll : public MidiEditor { int _quantLimit; int _to; bool _quantLen; - QuantConfig* quantConfig; bool _playEvents; //QScrollBar* infoScroll; @@ -160,7 +154,6 @@ class PianoRoll : public MidiEditor { //void trackInfoScroll(int); void setRaster(int); void setQuant(int); - void configQuant(); void setQuantStrength(int val) { _quantStrength = val; } void setQuantLimit(int val) { _quantLimit = val; } void setQuantLen(bool val) { _quantLen = val; } diff --git a/muse2/muse/midiedit/prcanvas.cpp b/muse2/muse/midiedit/prcanvas.cpp index a0ffdcaf..2966cf71 100644 --- a/muse2/muse/midiedit/prcanvas.cpp +++ b/muse2/muse/midiedit/prcanvas.cpp @@ -32,8 +32,6 @@ #include "mpevent.h" #include "globals.h" #include "cmd.h" -#include "gatetime.h" -#include "velocity.h" #include "song.h" #include "audio.h" @@ -82,7 +80,6 @@ PianoCanvas::PianoCanvas(MidiEditor* pr, QWidget* parent, int sx, int sy) : EventCanvas(pr, parent, sx, sy) { colorMode = 0; - cmdRange = 0; // all Events playedPitch = -1; songChanged(SC_TRACK_INSERTED); @@ -907,10 +904,8 @@ void PianoCanvas::drawCanvas(QPainter& p, const QRect& rect) // pulldown menu commands //--------------------------------------------------------- -void PianoCanvas::cmd(int cmd, int quantStrength, - int quantLimit, bool quantLen, int range) +void PianoCanvas::cmd(int cmd) { - cmdRange = range; switch (cmd) { case CMD_CUT: copy(); @@ -946,18 +941,7 @@ void PianoCanvas::cmd(int cmd, int quantStrength, song->endUndo(SC_EVENT_REMOVED); } return; - case CMD_OVER_QUANTIZE: // over quantize - quantize(100, 1, quantLen); - break; - case CMD_ON_QUANTIZE: // note on quantize - quantize(50, 1, false); - break; - case CMD_ONOFF_QUANTIZE: // note on/off quantize - quantize(50, 1, true); - break; - case CMD_ITERATIVE_QUANTIZE: // Iterative Quantize - quantize(quantStrength, quantLimit, quantLen); - break; + case CMD_SELECT_ALL: // select all for (iCItem k = items.begin(); k != items.end(); ++k) { if (!k->second->isSelected()) @@ -1032,96 +1016,6 @@ void PianoCanvas::cmd(int cmd, int quantStrength, editor->setCurCanvasPart(newpt); } break; - case CMD_MODIFY_GATE_TIME: - { - GateTime w(this); - w.setRange(range); - if (!w.exec()) - break; - int range = w.range(); // all, selected, looped, sel+loop - int rate = w.rateVal(); - int offset = w.offsetVal(); - - song->startUndo(); - for (iCItem k = items.begin(); k != items.end(); ++k) { - NEvent* nevent =(NEvent*)(k->second); - Event event = nevent->event(); - if (event.type() != Note) - continue; - unsigned tick = event.tick(); - bool selected = k->second->isSelected(); - bool inLoop = (tick >= song->lpos()) && (tick < song->rpos()); - - if ((range == 0) - || (range == 1 && selected) - || (range == 2 && inLoop) - || (range == 3 && selected && inLoop)) { - unsigned int len = event.lenTick(); //prevent compiler warning: comparison singed/unsigned - - len = rate ? (len * 100) / rate : 1; - len += offset; - if (len < 1) - 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, nevent->part(), false); - audio->msgChangeEvent(event, newEvent, nevent->part(), false, false, false); - } - } - } - song->endUndo(SC_EVENT_MODIFIED); - } - break; - - case CMD_MODIFY_VELOCITY: - { - Velocity w; - w.setRange(range); - if (!w.exec()) - break; - int range = w.range(); // all, selected, looped, sel+loop - int rate = w.rateVal(); - int offset = w.offsetVal(); - - song->startUndo(); - for (iCItem k = items.begin(); k != items.end(); ++k) { - NEvent* nevent = (NEvent*)(k->second); - Event event = nevent->event(); - if (event.type() != Note) - continue; - unsigned tick = event.tick(); - bool selected = k->second->isSelected(); - bool inLoop = (tick >= song->lpos()) && (tick < song->rpos()); - - if ((range == 0) - || (range == 1 && selected) - || (range == 2 && inLoop) - || (range == 3 && selected && inLoop)) { - int velo = event.velo(); - - //velo = rate ? (velo * 100) / rate : 64; - velo = (velo * rate) / 100; - velo += offset; - - if (velo <= 0) - velo = 1; - 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, nevent->part(), false); - audio->msgChangeEvent(event, newEvent, nevent->part(), false, false, false); - } - } - } - song->endUndo(SC_EVENT_MODIFIED); - } - break; case CMD_FIXED_LEN: //Set notes to the length specified in the drummap if (!selectionSize()) @@ -1231,55 +1125,6 @@ void PianoCanvas::cmd(int cmd, int quantStrength, } //--------------------------------------------------------- -// quantize -//--------------------------------------------------------- - -void PianoCanvas::quantize(int strength, int limit, bool quantLen) - { - song->startUndo(); - for (iCItem k = items.begin(); k != items.end(); ++k) { - NEvent* nevent = (NEvent*)(k->second); - Event event = nevent->event(); - Part* part = nevent->part(); - if (event.type() != Note) - continue; - - if ((cmdRange & CMD_RANGE_SELECTED) && !k->second->isSelected()) - continue; - - unsigned tick = event.tick() + part->tick(); - - if ((cmdRange & CMD_RANGE_LOOP) - && ((tick < song->lpos() || tick >= song->rpos()))) - continue; - - unsigned int len = event.lenTick(); //prevent compiler warning: comparison singed/unsigned - int tick2 = tick + len; - - // quant start position - int diff = AL::sigmap.raster(tick, editor->quant()) - tick; - if (abs(diff) > limit) - tick += ((diff * strength) / 100); - - // quant len - diff = AL::sigmap.raster(tick2, editor->quant()) - tick2; - if (quantLen && (abs(diff) > limit)) - len += ((diff * strength) / 100); - - // something changed? - if (((event.tick() + part->tick()) != tick) || (event.lenTick() != len)) { - Event newEvent = event.clone(); - newEvent.setTick(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); - audio->msgChangeEvent(event, newEvent, part, false, false, false); - } - } - song->endUndo(SC_EVENT_MODIFIED); - } - -//--------------------------------------------------------- // midiNote //--------------------------------------------------------- diff --git a/muse2/muse/midiedit/prcanvas.h b/muse2/muse/midiedit/prcanvas.h index bda22fc3..39506a13 100644 --- a/muse2/muse/midiedit/prcanvas.h +++ b/muse2/muse/midiedit/prcanvas.h @@ -37,7 +37,6 @@ class QRect; //--------------------------------------------------------- class PianoCanvas : public EventCanvas { - int cmdRange; int colorMode; int playedPitch; @@ -63,7 +62,6 @@ class PianoCanvas : public EventCanvas { int y2pitch(int) const; int pitch2y(int) const; virtual void drawCanvas(QPainter&, const QRect&); - void quantize(int, int, bool); void copy(); void paste(); virtual void itemPressed(const CItem*); @@ -88,8 +86,7 @@ class PianoCanvas : public EventCanvas { public: enum { CMD_CUT, CMD_COPY, CMD_PASTE, CMD_DEL, - CMD_OVER_QUANTIZE, CMD_ON_QUANTIZE, CMD_ONOFF_QUANTIZE, - CMD_ITERATIVE_QUANTIZE, + CMD_QUANTIZE, CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT, CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_SELECT_PREV_PART, CMD_SELECT_NEXT_PART, CMD_MODIFY_GATE_TIME, CMD_MODIFY_VELOCITY, @@ -100,7 +97,7 @@ class PianoCanvas : public EventCanvas { }; PianoCanvas(MidiEditor*, QWidget*, int, int); - void cmd(int, int, int, bool, int); + void cmd(int cmd); void setColorMode(int mode) { colorMode = mode; redraw(); diff --git a/muse2/muse/midiedit/quantconfig.cpp b/muse2/muse/midiedit/quantconfig.cpp deleted file mode 100644 index 2f413e6a..00000000 --- a/muse2/muse/midiedit/quantconfig.cpp +++ /dev/null @@ -1,79 +0,0 @@ -//========================================================= -// MusE -// Linux Music Editor -// $Id: quantconfig.cpp,v 1.2 2004/04/24 14:58:52 wschweer Exp $ -// -// (C) Copyright 1999/2003 Werner Schweer (ws@seh.de) -//========================================================= - -#include <QCheckBox> -#include <QGroupBox> -#include <QLabel> -#include <QSpinBox> -#include <QVBoxLayout> - -#include "quantconfig.h" - -const char* wtStrengthTxt = QT_TRANSLATE_NOOP("@default", "sets amount of quantization:\n" - "0 - no quantization\n" - "100 - full quantization"); -const char* wtQLimitTxt = QT_TRANSLATE_NOOP("@default", "don't quantize notes above this tick limit"); -const char* wtQLenTxt = QT_TRANSLATE_NOOP("@default", "quantize also note len as default"); - -//--------------------------------------------------------- -// QuantConfig -//--------------------------------------------------------- - -QuantConfig::QuantConfig(int s, int l, bool lenFlag) - : QDialog() - { - setWindowTitle(tr("MusE: Config Quantize")); - QVBoxLayout *mainlayout = new QVBoxLayout; - - QGridLayout* layout = new QGridLayout; - QGroupBox* gb = new QGroupBox(tr("Config Quantize")); - - QLabel* l1 = new QLabel(tr("Strength")); - layout->addWidget(l1, 0, 0); - QSpinBox* sb1 = new QSpinBox; - sb1->setMinimum(0); - sb1->setMaximum(100); - sb1->setSingleStep(1); - sb1->setSuffix(QString("%")); - sb1->setValue(s); - layout->addWidget(sb1, 0, 1); - - QLabel* l2 = new QLabel(tr("Donīt Quantize")); - layout->addWidget(l2, 1, 0); - QSpinBox* sb2 = new QSpinBox; - sb2->setMinimum(0); - sb2->setMaximum(500); - sb2->setSingleStep(1); - sb2->setValue(l); - layout->addWidget(sb2, 1, 1); - - QLabel* l3 = new QLabel(tr("Quant Len")); - layout->addWidget(l3, 2, 0); - QCheckBox* but = new QCheckBox; - but->setChecked(lenFlag); - layout->addWidget(but, 2, 1); - - connect(sb1, SIGNAL(valueChanged(int)), SIGNAL(setQuantStrength(int))); - connect(sb2, SIGNAL(valueChanged(int)), SIGNAL(setQuantLimit(int))); - connect(but, SIGNAL(toggled(bool)), SIGNAL(setQuantLen(bool))); - - gb->setLayout(layout); - mainlayout->addWidget(gb); - setLayout(mainlayout); - - l1->setWhatsThis(tr(wtStrengthTxt)); - l1->setToolTip(tr(wtStrengthTxt)); - sb1->setWhatsThis(tr(wtStrengthTxt)); - l2->setWhatsThis(tr(wtQLimitTxt)); - l2->setToolTip(tr(wtQLimitTxt)); - sb2->setWhatsThis(tr(wtQLimitTxt)); - l3->setWhatsThis(tr(wtQLenTxt)); - l3->setToolTip(tr(wtQLenTxt)); - but->setWhatsThis(tr(wtQLenTxt)); - } - diff --git a/muse2/muse/midiedit/quantconfig.h b/muse2/muse/midiedit/quantconfig.h deleted file mode 100644 index 4466cdf0..00000000 --- a/muse2/muse/midiedit/quantconfig.h +++ /dev/null @@ -1,32 +0,0 @@ -//========================================================= -// MusE -// Linux Music Editor -// $Id: quantconfig.h,v 1.1.1.1 2003/10/27 18:52:23 wschweer Exp $ -// -// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de) -//========================================================= - -#ifndef __QCONFIG_H__ -#define __QCONFIG_H__ - -#include <QDialog> - -//--------------------------------------------------------- -// QuantConfig -//--------------------------------------------------------- - -class QuantConfig : public QDialog { - Q_OBJECT - - signals: - void setQuantStrength(int); - void setQuantLimit(int); - void setQuantLen(bool); - - public: - QuantConfig(int, int, bool); - }; - - -#endif - diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp index 31f0f325..cb37c382 100644 --- a/muse2/muse/midiedit/scoreedit.cpp +++ b/muse2/muse/midiedit/scoreedit.cpp @@ -43,25 +43,20 @@ using namespace std; #include "mtscale.h" #include "prcanvas.h" #include "scoreedit.h" -#include "scrollscale.h" -#include "piano.h" -#include "../ctrl/ctrledit.h" -#include "splitter.h" #include "ttoolbar.h" #include "tb1.h" -#include "utils.h" #include "globals.h" #include "gconfig.h" #include "icons.h" #include "audio.h" +#include "functions.h" #include "cmd.h" -#include "quantconfig.h" -#include "shortcuts.h" - -#include "mtrackinfo.h" - #include "sig.h" +#include "song.h" + +//#include "../ctrl/ctrledit.h" +//#include "shortcuts.h" string IntToStr(int i); @@ -331,9 +326,15 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos) QAction* set_name_action = settings_menu->addAction(tr("Set Score &name"), menu_mapper, SLOT(map())); menu_mapper->setMapping(set_name_action, CMD_SET_NAME); - - + QMenu* functions_menu = menuBar()->addMenu(tr("&Functions")); + + QAction* func_quantize_action = functions_menu->addAction(tr("&Quantize"), menu_mapper, SLOT(map())); + QAction* func_notelen_action = functions_menu->addAction(tr("Change note &length"), menu_mapper, SLOT(map())); + QAction* func_velocity_action = functions_menu->addAction(tr("Change note &velocity"), menu_mapper, SLOT(map())); + menu_mapper->setMapping(func_quantize_action, CMD_QUANTIZE); + menu_mapper->setMapping(func_notelen_action, CMD_NOTELEN); + menu_mapper->setMapping(func_velocity_action, CMD_VELOCITY); score_canvas->song_changed(SC_EVENT_INSERTED); @@ -474,6 +475,10 @@ void ScoreEdit::menu_command(int cmd) } break; + case CMD_QUANTIZE: quantize_notes(score_canvas->get_all_parts()); break; + case CMD_VELOCITY: modify_velocity(score_canvas->get_all_parts()); break; + case CMD_NOTELEN: modify_notelen(score_canvas->get_all_parts()); break; + default: score_canvas->menu_command(cmd); } @@ -1097,6 +1102,15 @@ void ScoreCanvas::move_staff_below(list<staff_t>::iterator dest, list<staff_t>:: move_staff_above(dest, src); } +set<Part*> ScoreCanvas::get_all_parts() +{ + set<Part*> result; + + for (list<staff_t>::iterator it=staves.begin(); it!=staves.end(); it++) + result.insert(it->parts.begin(), it->parts.end()); + + return result; +} void ScoreCanvas::song_changed(int flags) { @@ -3913,16 +3927,19 @@ set<Part*> staff_t::parts_at_tick(unsigned tick) /* BUGS and potential bugs + * o the proper quantize functions must be used! yes, really! * 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 offer functions like in the pianoroll: quantize etc. * o support selections * o let the user select the distance between staves, or do this * automatically? + * o update translations + * o remove ambiguous translation: "offset"="zeitversatz" + * this is ambigous in mod. note len and WRONG in mod. velo dialogs * * IMPORTANT TODO * o add a select-clef-toolbox for tracks diff --git a/muse2/muse/midiedit/scoreedit.h b/muse2/muse/midiedit/scoreedit.h index 111a4f47..ed242aae 100644 --- a/muse2/muse/midiedit/scoreedit.h +++ b/muse2/muse/midiedit/scoreedit.h @@ -20,12 +20,13 @@ #include <QSignalMapper> #include <QAction> #include <QActionGroup> +#include <QGridLayout> #include <values.h> #include "noteinfo.h" #include "cobject.h" -#include "midieditor.h" -#include "tools.h" +//#include "midieditor.h" +//#include "tools.h" #include "event.h" #include "view.h" #include "gconfig.h" @@ -55,9 +56,12 @@ using std::string; enum {CMD_COLOR_BLACK, CMD_COLOR_VELO, CMD_COLOR_PART, CMD_SET_NAME, CMD_NOTELEN_1, CMD_NOTELEN_2, CMD_NOTELEN_4, CMD_NOTELEN_8, - CMD_NOTELEN_16, CMD_NOTELEN_32, CMD_NOTELEN_LAST }; + CMD_NOTELEN_16, CMD_NOTELEN_32, CMD_NOTELEN_LAST, + + CMD_QUANTIZE, CMD_VELOCITY, CMD_NOTELEN }; class ScoreCanvas; +class EditToolBar; //--------------------------------------------------------- // ScoreEdit @@ -725,6 +729,8 @@ class ScoreCanvas : public View Part* get_selected_part() {return selected_part;} void set_selected_part(Part* p) {selected_part=p;} + set<Part*> get_all_parts(); + void write_staves(int level, Xml& xml) const; }; diff --git a/muse2/muse/widgets/CMakeLists.txt b/muse2/muse/widgets/CMakeLists.txt index 261c27a2..ee4af793 100644 --- a/muse2/muse/widgets/CMakeLists.txt +++ b/muse2/muse/widgets/CMakeLists.txt @@ -76,6 +76,7 @@ QT4_WRAP_CPP (widget_mocs # ttoolbar.h ttoolbutton.h velocity.h + quantize.h verticalmeter.h view.h vscale.h @@ -111,6 +112,7 @@ file (GLOB widgets_ui_files transformbase.ui transposebase.ui velocitybase.ui + quantbase.ui ) QT4_WRAP_UI (widget_ui_headers ${widgets_ui_files}) @@ -177,6 +179,7 @@ file (GLOB widgets_source_files ttoolbutton.cpp utils.cpp velocity.cpp + quantize.cpp verticalmeter.cpp view.cpp vscale.cpp diff --git a/muse2/muse/widgets/gatetime.cpp b/muse2/muse/widgets/gatetime.cpp index f1804c35..c64411a0 100644 --- a/muse2/muse/widgets/gatetime.cpp +++ b/muse2/muse/widgets/gatetime.cpp @@ -26,6 +26,8 @@ GateTime::GateTime(QWidget* parent) rangeGroup->addButton(loopButton, 2); rangeGroup->addButton(sloopButton, 3); rangeGroup->setExclusive(true); + + pullValues(); } //--------------------------------------------------------- @@ -34,18 +36,30 @@ GateTime::GateTime(QWidget* parent) void GateTime::accept() { - _range = rangeGroup->checkedId(); - _rateVal = rate->value(); - _offsetVal = offset->value(); + pullValues(); QDialog::accept(); } //--------------------------------------------------------- -// setRange +// pullValues //--------------------------------------------------------- -void GateTime::setRange(int id) +void GateTime::pullValues() { - rangeGroup->button(id)->setChecked(true); + range = rangeGroup->checkedId(); + rateVal = rate->value(); + offsetVal = offset->value(); } +//--------------------------------------------------------- +// exec +//--------------------------------------------------------- + +int GateTime::exec() + { + rangeGroup->button(range)->setChecked(true); + rate->setValue(rateVal); + offset->setValue(offsetVal); + + return QDialog::exec(); + } diff --git a/muse2/muse/widgets/gatetime.h b/muse2/muse/widgets/gatetime.h index dcb1827c..5585d6ad 100644 --- a/muse2/muse/widgets/gatetime.h +++ b/muse2/muse/widgets/gatetime.h @@ -18,22 +18,24 @@ class QDialog; //--------------------------------------------------------- class GateTime : public QDialog, public Ui::GateTimeBase { + private: Q_OBJECT - int _range; - int _rateVal; - int _offsetVal; QButtonGroup *rangeGroup; protected slots: void accept(); + void pullValues(); public: GateTime(QWidget* parent=0); - void setRange(int id); - int range() const { return _range; } - int rateVal() const { return _rateVal; } - int offsetVal() const { return _offsetVal; } + + int range; + int rateVal; + int offsetVal; + + public slots: + int exec(); }; #endif diff --git a/muse2/muse/widgets/gatetimebase.ui b/muse2/muse/widgets/gatetimebase.ui index babf5f02..e804de17 100644 --- a/muse2/muse/widgets/gatetimebase.ui +++ b/muse2/muse/widgets/gatetimebase.ui @@ -11,7 +11,7 @@ </rect> </property> <property name="windowTitle"> - <string>MusE: Modify Gate Time</string> + <string>MusE: Modify Note Length</string> </property> <layout class="QVBoxLayout"> <property name="spacing"> @@ -59,7 +59,7 @@ <item> <widget class="QRadioButton" name="sloopButton"> <property name="text"> - <string>Selected & Looped</string> + <string>Selected Looped</string> </property> </widget> </item> @@ -104,7 +104,7 @@ <string>%</string> </property> <property name="maximum"> - <number>200</number> + <number>1000</number> </property> <property name="value"> <number>100</number> @@ -124,6 +124,13 @@ </property> </widget> </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>lenNew = (lenOld * rate) + offset</string> + </property> + </widget> + </item> </layout> </widget> </item> diff --git a/muse2/muse/widgets/quantbase.ui b/muse2/muse/widgets/quantbase.ui new file mode 100644 index 00000000..6a88c86f --- /dev/null +++ b/muse2/muse/widgets/quantbase.ui @@ -0,0 +1,308 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>QuantBase</class> + <widget class="QDialog" name="QuantBase"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>279</width> + <height>486</height> + </rect> + </property> + <property name="windowTitle"> + <string>MusE: Quantize</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>11</number> + </property> + <item> + <widget class="QGroupBox" name="rangeBox"> + <property name="title"> + <string>Range</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>6</number> + </property> + <property name="margin"> + <number>11</number> + </property> + <item> + <widget class="QRadioButton" name="all_events_button"> + <property name="text"> + <string>All Events</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="selected_events_button"> + <property name="text"> + <string>Selected Events</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="looped_events_button"> + <property name="text"> + <string>Looped Events</string> + </property> + </widget> + </item> + <item> + <widget class="QRadioButton" name="selected_looped_button"> + <property name="text"> + <string>Selected Looped</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Values</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <property name="margin"> + <number>11</number> + </property> + <property name="spacing"> + <number>6</number> + </property> + <item row="1" column="0"> + <widget class="QLabel" name="TextLabel3"> + <property name="text"> + <string>Strength:</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QSpinBox" name="strength_spinbox"> + <property name="suffix"> + <string>%</string> + </property> + <property name="maximum"> + <number>100</number> + </property> + <property name="value"> + <number>80</number> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="TextLabel4"> + <property name="text"> + <string>Threshold (ticks):</string> + </property> + <property name="wordWrap"> + <bool>false</bool> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QSpinBox" name="threshold_spinbox"> + <property name="minimum"> + <number>0</number> + </property> + <property name="maximum"> + <number>10000</number> + </property> + <property name="singleStep"> + <number>1</number> + </property> + </widget> + </item> + <item row="4" column="0"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Quantize Len</string> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QCheckBox" name="len_checkbox"> + <property name="text"> + <string/> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="0" column="0"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Raster</string> + </property> + </widget> + </item> + <item row="0" column="1"> + <widget class="QComboBox" name="raster_combobox"> + <property name="editable"> + <bool>false</bool> + </property> + <property name="currentIndex"> + <number>3</number> + </property> + <property name="frame"> + <bool>true</bool> + </property> + <item> + <property name="text"> + <string>Whole</string> + </property> + </item> + <item> + <property name="text"> + <string>Half</string> + </property> + </item> + <item> + <property name="text"> + <string>Quarter</string> + </property> + </item> + <item> + <property name="text"> + <string>8th</string> + </property> + </item> + <item> + <property name="text"> + <string>16th</string> + </property> + </item> + <item> + <property name="text"> + <string>32th</string> + </property> + </item> + </widget> + </item> + <item row="3" column="0"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Swing:</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QSpinBox" name="swing_spinbox"> + <property name="minimum"> + <number>-99</number> + </property> + </widget> + </item> + <item row="5" column="0" colspan="2"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>If the proposed change in tick or length is smaller than threshold, nothing is done. +If swing=0, this is normal +If swing is 33, you get a 2:1-rhythm. +If swing is -33, you get a 1:2-rhythm.</string> + </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> + </property> + <item> + <spacer name="Spacer1"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Expanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="ok_button"> + <property name="text"> + <string>OK</string> + </property> + <property name="autoDefault"> + <bool>false</bool> + </property> + <property name="default"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="cancel_button"> + <property name="text"> + <string>Cancel</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <layoutdefault spacing="6" margin="11"/> + <resources/> + <connections> + <connection> + <sender>ok_button</sender> + <signal>clicked()</signal> + <receiver>QuantBase</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> + </connection> + <connection> + <sender>cancel_button</sender> + <signal>clicked()</signal> + <receiver>QuantBase</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>20</x> + <y>20</y> + </hint> + <hint type="destinationlabel"> + <x>20</x> + <y>20</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/muse2/muse/widgets/quantize.cpp b/muse2/muse/widgets/quantize.cpp new file mode 100644 index 00000000..734f3d5d --- /dev/null +++ b/muse2/muse/widgets/quantize.cpp @@ -0,0 +1,54 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: quantize.cpp,v 1.1.1.1 2011/05/05 18:51:04 flo93 Exp $ +// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net) +//========================================================= + +#include <QButtonGroup> +#include "quantize.h" + + +Quantize::Quantize(QWidget* parent) + : QDialog(parent) +{ + setupUi(this); + range_group = new QButtonGroup; + range_group->addButton(all_events_button,0); + range_group->addButton(selected_events_button,1); + range_group->addButton(looped_events_button,2); + range_group->addButton(selected_looped_button,3); + + pull_values(); +} + +void Quantize::pull_values() +{ + range = range_group->checkedId(); + strength = strength_spinbox->value(); + threshold = threshold_spinbox->value(); + raster_power2 = raster_combobox->currentIndex(); + quant_len = len_checkbox->isChecked(); + swing = swing_spinbox->value(); +} + +void Quantize::accept() +{ + pull_values(); + QDialog::accept(); +} + +int Quantize::exec() +{ + if ((range < 0) || (range > 3)) range=0; + + range_group->button(range)->setChecked(true); + strength_spinbox->setValue(strength); + threshold_spinbox->setValue(threshold); + raster_combobox->setCurrentIndex(raster_power2); + len_checkbox->setChecked(quant_len); + swing_spinbox->setValue(swing); + + return QDialog::exec(); +} + diff --git a/muse2/muse/widgets/quantize.h b/muse2/muse/widgets/quantize.h new file mode 100644 index 00000000..3f54bc09 --- /dev/null +++ b/muse2/muse/widgets/quantize.h @@ -0,0 +1,40 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: quantize.h,v 1.1.1.1 2011/05/05 18:51:04 flo93 Exp $ +// (C) Copyright 2011 Florian Jung (flo93@sourceforge.net) +//========================================================= + +#ifndef __QUANTIZE_H__ +#define __QUANTIZE_H__ + +#include "ui_quantbase.h" + +class QButtonGroup; + +class Quantize : public QDialog, public Ui::QuantBase +{ + private: + Q_OBJECT + QButtonGroup* range_group; + + protected slots: + void accept(); + void pull_values(); + + public: + Quantize(QWidget* parent = 0); + + int range; + int strength; + int threshold; + int raster_power2; + int swing; + bool quant_len; + + public slots: + int exec(); +}; + +#endif + diff --git a/muse2/muse/widgets/velocity.cpp b/muse2/muse/widgets/velocity.cpp index 309beb4d..ad9bbfe4 100644 --- a/muse2/muse/widgets/velocity.cpp +++ b/muse2/muse/widgets/velocity.cpp @@ -12,7 +12,7 @@ // Velocity //--------------------------------------------------------- -Velocity::Velocity(QDialog* parent) +Velocity::Velocity(QWidget* parent) : QDialog(parent) { setupUi(this); @@ -21,6 +21,8 @@ Velocity::Velocity(QDialog* parent) rangeGroup->addButton(selectedEvents,1); rangeGroup->addButton(loopedEvents,2); rangeGroup->addButton(selectedLooped,3); + + pullValues(); } //--------------------------------------------------------- @@ -29,18 +31,30 @@ Velocity::Velocity(QDialog* parent) void Velocity::accept() { - _range = rangeGroup->checkedId(); - _rateVal = rate->value(); - _offsetVal = offset->value(); + pullValues(); QDialog::accept(); } //--------------------------------------------------------- -// setRange +// pullValues //--------------------------------------------------------- -void Velocity::setRange(int id) +void Velocity::pullValues() { - rangeGroup->button(id)->setChecked(true); + range = rangeGroup->checkedId(); + rateVal = rate->value(); + offsetVal = offset->value(); } +//--------------------------------------------------------- +// exec +//--------------------------------------------------------- + +int Velocity::exec() + { + rangeGroup->button(range)->setChecked(true); + rate->setValue(rateVal); + offset->setValue(offsetVal); + + return QDialog::exec(); + } diff --git a/muse2/muse/widgets/velocity.h b/muse2/muse/widgets/velocity.h index cf5b2779..448b3e5b 100644 --- a/muse2/muse/widgets/velocity.h +++ b/muse2/muse/widgets/velocity.h @@ -17,22 +17,23 @@ class QButtonGroup; //--------------------------------------------------------- class Velocity : public QDialog, public Ui::VelocityBase { - int _range; - int _rateVal; - int _offsetVal; - + private: Q_OBJECT QButtonGroup* rangeGroup; protected slots: void accept(); + void pullValues(); public: - Velocity(QDialog* parent = 0); - void setRange(int id); - int range() const { return _range; } - int rateVal() const { return _rateVal; } - int offsetVal() const { return _offsetVal; } + Velocity(QWidget* parent = 0); + + int range; + int rateVal; + int offsetVal; + + public slots: + int exec(); }; #endif diff --git a/muse2/muse/widgets/velocitybase.ui b/muse2/muse/widgets/velocitybase.ui index 1e386e11..40fe625f 100644 --- a/muse2/muse/widgets/velocitybase.ui +++ b/muse2/muse/widgets/velocitybase.ui @@ -59,7 +59,7 @@ <item> <widget class="QRadioButton" name="selectedLooped"> <property name="text"> - <string>Selected & Looped</string> + <string>Selected Looped</string> </property> </widget> </item> @@ -114,7 +114,7 @@ <item row="1" column="1"> <widget class="QSpinBox" name="offset"> <property name="minimum"> - <number>1</number> + <number>-127</number> </property> <property name="maximum"> <number>127</number> @@ -122,6 +122,16 @@ <property name="singleStep"> <number>1</number> </property> + <property name="value"> + <number>0</number> + </property> + </widget> + </item> + <item row="2" column="0" colspan="2"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>veloNew = (veloOld * rate) + offset</string> + </property> </widget> </item> </layout> |