1
//=========================================================
4
// $Id: pianoroll.cpp,v 1.1 2002/01/30 14:10:08 muse Exp $
5
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
6
//=========================================================
13
#include "pianoroll.h"
14
#include "scrollscale.h"
16
#include "../ctrl/ctrledit.h"
24
#include "midithread.h"
29
#include <qsizegrip.h>
31
#include <qpushbutton.h>
32
#include <qbuttongroup.h>
33
#include <qtoolbutton.h>
35
#include <qpopupmenu.h>
37
#include <qapplication.h>
38
#include <qclipboard.h>
41
#include "quantconfig.h"
43
int PianoRoll::_quantInit = 96;
44
int PianoRoll::_rasterInit = 96;
45
int PianoRoll::_quantStrengthInit = 80; // 1 - 100%
46
int PianoRoll::_quantLimitInit = 50; // tick value
47
bool PianoRoll::_quantLenInit = false;
48
int PianoRoll::_toInit = 0;
49
int PianoRoll::colorModeInit = 0;
51
static const int xscale = -10;
52
static const int yscale = 1;
53
static const int pianoWidth = 40;
55
//---------------------------------------------------------
57
//---------------------------------------------------------
59
PianoRoll::PianoRoll(PartList* pl, QWidget* parent = 0, const char* name = 0)
60
: MidiEditor(_quantInit, _rasterInit, pl, parent, name)
66
_quantStrength = _quantStrengthInit;
67
_quantLimit = _quantLimitInit;
68
_quantLen = _quantLenInit;
70
colorMode = colorModeInit;
72
//---------Menļæ½----------------------------------
73
menuEdit = new QPopupMenu(this);
74
menuBar()->insertItem(tr("&Edit"), menuEdit);
75
menuEdit->insertItem(tr("Cut"), PianoCanvas::CMD_CUT);
76
menuEdit->setAccel(CTRL+Key_X, PianoCanvas::CMD_CUT);
77
menuEdit->insertItem(tr("Copy"), PianoCanvas::CMD_COPY);
78
menuEdit->setAccel(CTRL+Key_C, PianoCanvas::CMD_COPY);
79
menuEdit->insertItem(tr("Paste"), PianoCanvas::CMD_PASTE);
80
menuEdit->setAccel(CTRL+Key_V, PianoCanvas::CMD_PASTE);
81
menuEdit->insertSeparator();
82
menuEdit->insertItem(tr("Delete Events"), PianoCanvas::CMD_DEL);
83
menuEdit->insertSeparator();
85
QPopupMenu* menuSelect = new QPopupMenu(this);
86
menuSelect->insertItem(tr("Select All"), PianoCanvas::CMD_SELECT_ALL);
87
menuSelect->insertItem(tr("Select None"), PianoCanvas::CMD_SELECT_NONE);
88
menuSelect->insertItem(tr("Invert"), PianoCanvas::CMD_SELECT_INVERT);
89
menuSelect->insertSeparator();
90
menuSelect->insertItem(tr("Inside Loop"), PianoCanvas::CMD_SELECT_ILOOP);
91
menuSelect->insertItem(tr("Outside Loop"), PianoCanvas::CMD_SELECT_OLOOP);
92
menuEdit->insertItem(tr("&Select"), menuSelect);
94
eventColor = new QPopupMenu(this);
95
eventColor->insertItem(tr("blue"), 0);
96
eventColor->insertItem(tr("pitch colors"), 1);
97
eventColor->insertItem(tr("velocity colors"), 2);
98
connect(eventColor, SIGNAL(activated(int)), SLOT(setEventColorMode(int)));
100
QPopupMenu* menuConfig = new QPopupMenu(this);
101
menuBar()->insertItem(tr("&Config"), menuConfig);
102
menuConfig->insertItem(tr("event color"), eventColor, Key_E);
104
menuFunctions = new QPopupMenu(this);
105
menuBar()->insertItem(tr("&Functions"), menuFunctions);
106
menuFunctions->insertTearOffHandle();
107
menuFunctions->insertItem(tr("Over Quantize"), PianoCanvas::CMD_OVER_QUANTIZE);
108
menuFunctions->insertItem(tr("Note On Quantize"), PianoCanvas::CMD_ON_QUANTIZE);
109
menuFunctions->insertItem(tr("Note On/Off Quantize"), PianoCanvas::CMD_ONOFF_QUANTIZE);
110
menuFunctions->insertItem(tr("Iterative Quantize"), PianoCanvas::CMD_ITERATIVE_QUANTIZE);
111
menuFunctions->insertSeparator();
112
menuFunctions->insertItem(tr("Config Quant..."), this,
113
SLOT(configQuant()));
114
menuFunctions->insertSeparator();
115
menuFunctions->insertItem(tr("Modify Gate Time"), PianoCanvas::CMD_MODIFY_GATE_TIME);
116
menuFunctions->insertItem(tr("Modify Velocity"), PianoCanvas::CMD_MODIFY_VELOCITY);
117
menuFunctions->insertItem(tr("Crescendo"), PianoCanvas::CMD_CRESCENDO);
118
menuFunctions->insertItem(tr("Transpose"), PianoCanvas::CMD_TRANSPOSE);
119
menuFunctions->insertItem(tr("Thin Out"), PianoCanvas::CMD_THIN_OUT);
120
menuFunctions->insertItem(tr("Erase Event"), PianoCanvas::CMD_ERASE_EVENT);
121
menuFunctions->insertItem(tr("Note Shift"), PianoCanvas::CMD_NOTE_SHIFT);
122
menuFunctions->insertItem(tr("Move Clock"), PianoCanvas::CMD_MOVE_CLOCK);
123
menuFunctions->insertItem(tr("Copy Measure"), PianoCanvas::CMD_COPY_MEASURE);
124
menuFunctions->insertItem(tr("Erase Measure"), PianoCanvas::CMD_ERASE_MEASURE);
125
menuFunctions->insertItem(tr("Delete Measure"), PianoCanvas::CMD_DELETE_MEASURE);
126
menuFunctions->insertItem(tr("Create Measure"), PianoCanvas::CMD_CREATE_MEASURE);
128
menuFunctions->setItemEnabled(PianoCanvas::CMD_CRESCENDO, false);
129
menuFunctions->setItemEnabled(PianoCanvas::CMD_TRANSPOSE, false);
130
menuFunctions->setItemEnabled(PianoCanvas::CMD_THIN_OUT, false);
131
menuFunctions->setItemEnabled(PianoCanvas::CMD_ERASE_EVENT, false);
132
menuFunctions->setItemEnabled(PianoCanvas::CMD_NOTE_SHIFT, false);
133
menuFunctions->setItemEnabled(PianoCanvas::CMD_MOVE_CLOCK, false);
134
menuFunctions->setItemEnabled(PianoCanvas::CMD_COPY_MEASURE, false);
135
menuFunctions->setItemEnabled(PianoCanvas::CMD_ERASE_MEASURE, false);
136
menuFunctions->setItemEnabled(PianoCanvas::CMD_DELETE_MEASURE, false);
137
menuFunctions->setItemEnabled(PianoCanvas::CMD_CREATE_MEASURE, false);
139
connect(menuEdit, SIGNAL(activated(int)), SLOT(cmd(int)));
140
connect(menuSelect, SIGNAL(activated(int)), SLOT(cmd(int)));
141
connect(menuFunctions, SIGNAL(activated(int)), SLOT(cmd(int)));
143
//---------ToolBar----------------------------------
144
tools = new QToolBar(this, "pianoroll-tools");
145
tools->setLabel(tr("Pianoroll Tools"));
146
undoRedo->addTo(tools);
147
tools->addSeparator();
149
srec = new QToolButton(tools, "srec");
150
QToolTip::add(srec, tr("Step Record"));
151
srec->setPixmap(*steprecIcon);
152
srec->setToggleButton(true);
154
midiin = new QToolButton(tools, "midiin");
155
QToolTip::add(midiin, tr("Midi Input"));
156
midiin->setPixmap(*midiinIcon);
157
midiin->setToggleButton(true);
159
speaker = new QToolButton(tools, "speaker");
160
QToolTip::add(speaker, tr("Play Events"));
161
speaker->setPixmap(*speakerIcon);
162
speaker->setToggleButton(true);
164
tools2 = new EditToolBar(this, PointerTool | PencilTool | RubberTool | DrawTool);
166
//-------------------------------------------------------------
168
new TransportToolbar(this);
170
toolbar = new Toolbar1(this, _rasterInit, _quantInit);
171
info = new NoteInfo(this);
173
//---------------------------------------------------
175
//---------------------------------------------------
177
splitter = new Splitter(Vertical, mainw, "splitter");
178
QPushButton* ctrl = new QPushButton("ctrl", mainw, "Ctrl");
179
QToolTip::add(ctrl, tr("Add Controller View"));
180
hscroll = new ScrollScale(-25, -2, xscale, 20000, Horizontal, mainw);
181
ctrl->setFixedSize(pianoWidth, hscroll->sizeHint().height());
183
QSizeGrip* corner = new QSizeGrip(mainw);
185
mainGrid->setRowStretch(0, 100);
186
mainGrid->setColStretch(1, 100);
187
mainGrid->addMultiCellWidget(splitter, 0, 0, 0, 2);
188
mainGrid->addWidget(ctrl, 1, 0);
189
mainGrid->addWidget(hscroll, 1, 1);
190
mainGrid->addWidget(corner, 1, 2, AlignBottom|AlignRight);
191
mainGrid->addRowSpacing(1, hscroll->sizeHint().height());
193
QWidget* split1 = new QWidget(splitter, "split1");
194
QGridLayout* gridS1 = new QGridLayout(split1);
195
time = new MTScale(&_raster, split1, xscale);
196
Piano* piano = new Piano(split1, yscale);
197
canvas = new PianoCanvas(this, split1, xscale, yscale);
198
vscroll = new ScrollScale(-3, 7, yscale, KH * 75, Vertical, split1);
200
int offset = -(division/4);
201
canvas->setOrigin(offset, 0);
202
time->setOrigin(offset, 0);
204
gridS1->setRowStretch(2, 100);
205
gridS1->setColStretch(1, 100);
207
gridS1->addMultiCellWidget(time, 0, 0, 1, 2);
208
gridS1->addMultiCellWidget(hLine(split1), 1, 1, 0, 2);
209
gridS1->addWidget(piano, 2, 0);
210
gridS1->addWidget(canvas, 2, 1);
211
gridS1->addWidget(vscroll, 2, 2);
213
piano->setFixedWidth(pianoWidth);
215
connect(tools2, SIGNAL(toolChanged(int)), canvas, SLOT(setTool(int)));
217
connect(ctrl, SIGNAL(clicked()), SLOT(addCtrl()));
218
connect(info, SIGNAL(valueChanged(NoteInfo::ValType, int)), SLOT(noteinfoChanged(NoteInfo::ValType, int)));
219
connect(vscroll, SIGNAL(scrollChanged(int)), piano, SLOT(setYPos(int)));
220
connect(vscroll, SIGNAL(scrollChanged(int)), canvas, SLOT(setYPos(int)));
221
connect(vscroll, SIGNAL(scaleChanged(int)), canvas, SLOT(setYMag(int)));
222
connect(vscroll, SIGNAL(scaleChanged(int)), piano, SLOT(setYMag(int)));
224
connect(hscroll, SIGNAL(scrollChanged(int)), canvas, SLOT(setXPos(int)));
225
connect(hscroll, SIGNAL(scrollChanged(int)), time, SLOT(setXPos(int)));
227
connect(hscroll, SIGNAL(scaleChanged(int)), canvas, SLOT(setXMag(int)));
228
connect(hscroll, SIGNAL(scaleChanged(int)), time, SLOT(setXMag(int)));
230
connect(canvas, SIGNAL(pitchChanged(int)), piano, SLOT(setPitch(int)));
231
connect(canvas, SIGNAL(selectionChanged(int, Event*, Part*)), this,
232
SLOT(setSelection(int, Event*, Part*)));
234
connect(piano, SIGNAL(keyPressed(int, bool)), canvas, SLOT(pianoPressed(int, bool)));
235
connect(piano, SIGNAL(keyReleased(int, bool)), canvas, SLOT(pianoReleased(int, bool)));
236
connect(srec, SIGNAL(toggled(bool)), SLOT(setSteprec(bool)));
237
connect(midiin, SIGNAL(toggled(bool)), canvas, SLOT(setMidiin(bool)));
238
connect(speaker, SIGNAL(toggled(bool)), SLOT(setSpeaker(bool)));
239
connect(canvas, SIGNAL(followEvent(int)), SLOT(follow(int)));
241
piano->setYPos(KH * 30);
242
canvas->setYPos(KH * 30);
243
vscroll->setPos(KH * 30);
244
setSelection(0, 0, 0);
246
connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
247
connect(song, SIGNAL(soloChanged(SoundSource*)), SLOT(soloChanged(SoundSource*)));
249
setCaption(canvas->getCaption());
251
canvas->range(&s, &e);
252
hscroll->setRange(s, e);
254
// connect to toolbar
255
connect(canvas, SIGNAL(pitchChanged(int)), toolbar, SLOT(setPitch(int)));
256
connect(canvas, SIGNAL(timeChanged(int)), SLOT(setTime(int)));
257
connect(piano, SIGNAL(pitchChanged(int)), toolbar, SLOT(setPitch(int)));
258
connect(time, SIGNAL(timeChanged(int)), SLOT(setTime(int)));
259
connect(toolbar, SIGNAL(quantChanged(int)), SLOT(setQuant(int)));
260
connect(toolbar, SIGNAL(rasterChanged(int)),SLOT(setRaster(int)));
261
connect(toolbar, SIGNAL(toChanged(int)), SLOT(setTo(int)));
262
connect(toolbar, SIGNAL(soloChanged(bool)), SLOT(soloChanged(bool)));
264
setFocusPolicy(StrongFocus);
265
setEventColorMode(colorMode);
267
QClipboard* cb = QApplication::clipboard();
268
connect(cb, SIGNAL(dataChanged()), SLOT(clipboardChanged()));
270
clipboardChanged(); // enable/disable "Paste"
271
selectionChanged(); // enable/disable "Copy" & "Paste"
274
//---------------------------------------------------------
276
//---------------------------------------------------------
278
void PianoRoll::follow(int pos)
281
canvas->range(&s, &e);
283
if (pos < e && pos >= s)
284
hscroll->setOffset(pos);
286
hscroll->setOffset(s);
289
//---------------------------------------------------------
291
//---------------------------------------------------------
293
void PianoRoll::setTime(int tick)
295
toolbar->setTime(tick);
296
time->setPos(3, tick, false);
299
//---------------------------------------------------------
301
//---------------------------------------------------------
303
PianoRoll::~PianoRoll()
305
undoRedo->removeFrom(tools);
308
//---------------------------------------------------------
310
// pulldown menu commands
311
//---------------------------------------------------------
313
void PianoRoll::cmd(int cmd)
315
((PianoCanvas*)canvas)->cmd(cmd, _quantStrength, _quantLimit, _quantLen, _to);
318
//---------------------------------------------------------
321
//---------------------------------------------------------
323
void PianoRoll::setSelection(int tick, Event* e, Part* p)
325
selEvent = (MidiEvent*)e;
326
selPart = (MidiPart*)p;
329
info->setEnabled(true);
330
info->setValues(tick,
335
selEvent->channel()+1);
338
info->setEnabled(false);
343
//---------------------------------------------------------
344
// edit currently selected Event
345
//---------------------------------------------------------
347
void PianoRoll::noteinfoChanged(NoteInfo::ValType type, int val)
350
printf("noteinfoChanged while note is zero\n");
353
MidiEvent* event = new MidiEvent(*selEvent);
355
case NoteInfo::VAL_TIME:
357
case NoteInfo::VAL_LEN:
358
event->setLenTick(val);
360
case NoteInfo::VAL_VELON:
363
case NoteInfo::VAL_VELOFF:
364
event->setVeloOff(val);
366
case NoteInfo::VAL_CHANNEL:
367
// event->setChannel(val-1);
369
case NoteInfo::VAL_PITCH:
370
event->setPitch(val);
373
midiThread->msgChangeEvent(selEvent, event, selPart);
376
//---------------------------------------------------------
378
//---------------------------------------------------------
380
CtrlEdit* PianoRoll::addCtrl()
382
CtrlEdit* ctrlEdit = new CtrlEdit(splitter, this, xscale, false, "pianoCtrlEdit");
383
connect(tools2, SIGNAL(toolChanged(int)), ctrlEdit, SLOT(setTool(int)));
384
connect(hscroll, SIGNAL(scrollChanged(int)), ctrlEdit, SLOT(setXPos(int)));
385
connect(hscroll, SIGNAL(scaleChanged(int)), ctrlEdit, SLOT(setXMag(int)));
386
connect(ctrlEdit, SIGNAL(timeChanged(int)), SLOT(setTime(int)));
387
connect(ctrlEdit, SIGNAL(destroyedCtrl(CtrlEdit*)), SLOT(removeCtrl(CtrlEdit*)));
388
connect(ctrlEdit, SIGNAL(yposChanged(int)), toolbar, SLOT(setInt(int)));
390
//TODO init: ctrlEdit->setTool(??);
391
ctrlEdit->setXPos(hscroll->pos());
392
ctrlEdit->setXMag(hscroll->getScaleValue());
395
ctrlEditList.push_back(ctrlEdit);
399
//---------------------------------------------------------
401
//---------------------------------------------------------
403
void PianoRoll::removeCtrl(CtrlEdit* ctrl)
405
for (std::list<CtrlEdit*>::iterator i = ctrlEditList.begin();
406
i != ctrlEditList.end(); ++i) {
408
ctrlEditList.erase(i);
414
//---------------------------------------------------------
416
//---------------------------------------------------------
418
void PianoRoll::closeEvent(QCloseEvent* e)
420
emit deleted((int)this);
424
//---------------------------------------------------------
426
//---------------------------------------------------------
428
void PianoRoll::readConfiguration(Xml& xml)
431
Xml::Token token = xml.parse();
432
if (token == Xml::Error || token == Xml::End)
434
const QString& tag = xml.s1();
438
_quantInit = xml.parseInt();
439
else if (tag == "raster")
440
_rasterInit = xml.parseInt();
441
else if (tag == "quantStrength")
442
_quantStrengthInit = xml.parseInt();
443
else if (tag == "quantLimit")
444
_quantLimitInit = xml.parseInt();
445
else if (tag == "quantLen")
446
_quantLenInit = xml.parseInt();
447
else if (tag == "to")
448
_toInit = xml.parseInt();
449
else if (tag == "colormode")
450
colorModeInit = xml.parseInt();
452
xml.unknown("PianoRoll");
455
if (tag == "pianoroll")
463
//---------------------------------------------------------
464
// writeConfiguration
465
//---------------------------------------------------------
467
void PianoRoll::writeConfiguration(int level, Xml& xml)
469
xml.tag(level++, "pianoroll");
470
xml.intTag(level, "quant", _quantInit);
471
xml.intTag(level, "raster", _rasterInit);
472
xml.intTag(level, "quantStrength", _quantStrengthInit);
473
xml.intTag(level, "quantLimit", _quantLimitInit);
474
xml.intTag(level, "quantLen", _quantLenInit);
475
xml.intTag(level, "to", _toInit);
476
xml.intTag(level, "colormode", colorModeInit);
477
xml.etag(level, "pianoroll");
480
void PianoRoll::soloChanged(SoundSource* s)
482
toolbar->setSolo(s == canvas->track());
485
void PianoRoll::soloChanged(bool flag)
487
song->setSolo(flag ? canvas->track() : 0);
490
void PianoRoll::setRaster(int val)
493
MidiEditor::setRaster(val);
494
canvas->setFocus(); // give back focus after kb input
496
void PianoRoll::setQuant(int val)
499
MidiEditor::setQuant(val);
500
canvas->setQuant(val);
504
//---------------------------------------------------------
506
//---------------------------------------------------------
508
void PianoRoll::writeStatus(int level, Xml& xml) const
510
writePartList(level, xml);
511
xml.tag(level++, "pianoroll");
512
MidiEditor::writeStatus(level, xml);
513
splitter->writeStatus(level, xml);
515
for (std::list<CtrlEdit*>::const_iterator i = ctrlEditList.begin();
516
i != ctrlEditList.end(); ++i) {
517
(*i)->writeStatus(level, xml);
520
xml.intTag(level, "steprec", canvas->steprec());
521
xml.intTag(level, "midiin", canvas->midiin());
522
xml.intTag(level, "tool", int(canvas->tool()));
523
xml.intTag(level, "quantStrength", _quantStrength);
524
xml.intTag(level, "quantLimit", _quantLimit);
525
xml.intTag(level, "quantLen", _quantLen);
526
xml.intTag(level, "playEvents", _playEvents);
527
xml.intTag(level, "xpos", hscroll->pos());
528
xml.intTag(level, "xmag", hscroll->mag());
529
xml.intTag(level, "ypos", vscroll->pos());
530
xml.intTag(level, "ymag", vscroll->mag());
531
xml.tag(level, "/pianoroll");
534
//---------------------------------------------------------
536
//---------------------------------------------------------
538
void PianoRoll::readStatus(Xml& xml)
541
Xml::Token token = xml.parse();
542
if (token == Xml::Error || token == Xml::End)
544
const QString& tag = xml.s1();
547
if (tag == "steprec") {
548
int val = xml.parseInt();
549
canvas->setSteprec(val);
552
else if (tag == "midiin") {
553
int val = xml.parseInt();
554
canvas->setMidiin(val);
557
else if (tag == "tool") {
558
int tool = xml.parseInt();
559
canvas->setTool(tool);
562
else if (tag == "midieditor")
563
MidiEditor::readStatus(xml);
564
else if (tag == "ctrledit") {
565
CtrlEdit* ctrl = addCtrl();
566
ctrl->readStatus(xml);
568
else if (tag == splitter->name())
569
splitter->readStatus(xml);
570
else if (tag == "quantStrength")
571
_quantStrength = xml.parseInt();
572
else if (tag == "quantLimit")
573
_quantLimit = xml.parseInt();
574
else if (tag == "quantLen")
575
_quantLen = xml.parseInt();
576
else if (tag == "playEvents") {
577
_playEvents = xml.parseInt();
578
canvas->playEvents(_playEvents);
579
speaker->setOn(_playEvents);
581
else if (tag == "xmag")
582
hscroll->setMag(xml.parseInt());
583
else if (tag == "xpos")
584
hscroll->setPos(xml.parseInt());
585
else if (tag == "ymag")
586
vscroll->setMag(xml.parseInt());
587
else if (tag == "ypos")
588
vscroll->setPos(xml.parseInt());
590
xml.unknown("PianoRoll");
593
if (tag == "pianoroll") {
595
_rasterInit = _raster;
596
toolbar->setRaster(_raster);
597
toolbar->setQuant(_quant);
598
canvas->setQuant(_quant);
607
static int rasterTable[] = {
608
//-9----8- 7 6 5 4 3(1/4) 2 1
609
4, 8, 16, 32, 64, 128, 256, 512, 1024, // triple
610
6, 12, 24, 48, 96, 192, 384, 768, 1536,
611
9, 18, 36, 72, 144, 288, 576, 1152, 2304 // dot
614
//---------------------------------------------------------
616
//---------------------------------------------------------
618
void PianoRoll::keyPressEvent(QKeyEvent* event)
620
if (info->hasFocus()) {
624
bool shift = event->state() & ShiftButton;
625
// bool ctrl = event->state() & ControlButton;
628
int n = sizeof(rasterTable);
629
for (; index < n; ++index)
630
if (rasterTable[index] == raster())
632
int off = (index / 9) * 9;
637
PianoCanvas* pc = (PianoCanvas*)canvas;
638
switch(event->key()) {
640
pc->pianoCmd(shift ? CMD_INSERT : CMD_RIGHT);
643
pc->pianoCmd(CMD_LEFT);
646
pc->pianoCmd(CMD_INSERT);
649
pc->pianoCmd(CMD_DELETE);
652
val = rasterTable[8 + off];
655
val = rasterTable[7 + off];
658
val = rasterTable[6 + off];
661
val = rasterTable[5 + off];
664
val = rasterTable[4 + off];
667
val = rasterTable[3 + off];
670
val = rasterTable[2 + off];
673
val = rasterTable[index + ((off == 0) ? 9 : 0)];
676
val = rasterTable[index + ((off == 18) ? 9 : 18)];
678
case Key_Comma: //CDW
679
if ((off == 18) && (index > 2)) {
680
val = rasterTable[index + 9 - 1];
683
else if ((off == 9) && (index < 8)) {
684
val = rasterTable[index + 18 + 1];
695
toolbar->setQuant(_quant);
696
toolbar->setRaster(_raster);
699
//---------------------------------------------------------
701
//---------------------------------------------------------
703
void PianoRoll::configQuant()
706
quantConfig = new QuantConfig(_quantStrength, _quantLimit, _quantLen);
707
connect(quantConfig, SIGNAL(setQuantStrength(int)), SLOT(setQuantStrength(int)));
708
connect(quantConfig, SIGNAL(setQuantLimit(int)), SLOT(setQuantLimit(int)));
709
connect(quantConfig, SIGNAL(setQuantLen(bool)), SLOT(setQuantLen(bool)));
714
//---------------------------------------------------------
716
//---------------------------------------------------------
718
void PianoRoll::setSteprec(bool flag)
720
canvas->setSteprec(flag);
725
//---------------------------------------------------------
727
//---------------------------------------------------------
729
void PianoRoll::setEventColorMode(int mode)
732
colorModeInit = colorMode;
733
eventColor->setItemChecked(0, mode == 0);
734
eventColor->setItemChecked(1, mode == 1);
735
eventColor->setItemChecked(2, mode == 2);
736
((PianoCanvas*)(canvas))->setColorMode(colorMode);
739
//---------------------------------------------------------
741
//---------------------------------------------------------
743
void PianoRoll::clipboardChanged()
745
QMimeSource* ms = QApplication::clipboard()->data();
746
if (ms && ms->format(0)) {
747
bool flag = strcmp(ms->format(0), "text/eventlist;charset=UTF-8") == 0;
748
menuEdit->setItemEnabled(PianoCanvas::CMD_PASTE, flag);
752
//---------------------------------------------------------
754
//---------------------------------------------------------
756
void PianoRoll::selectionChanged()
758
bool flag = canvas->selectionSize() > 0;
759
menuEdit->setItemEnabled(PianoCanvas::CMD_CUT, flag);
760
menuEdit->setItemEnabled(PianoCanvas::CMD_COPY, flag);
761
menuEdit->setItemEnabled(PianoCanvas::CMD_DEL, flag);
764
//---------------------------------------------------------
766
//---------------------------------------------------------
768
void PianoRoll::setSpeaker(bool val)
771
canvas->playEvents(_playEvents);