1
1
//=========================================================
3
3
// Linux Music Editor
4
// $Id: drumedit.cpp,v 1.1 2002/01/30 14:10:08 muse Exp $
4
// $Id: drumedit.cpp,v 1.3 2003/11/19 21:28:40 lunar_shuttle Exp $
5
5
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
6
6
//=========================================================
52
52
int DrumEdit::_quantInit = 96;
53
53
int DrumEdit::_rasterInit = 96;
54
int DrumEdit::_widthInit = 600;
55
int DrumEdit::_heightInit = 400;
56
int DrumEdit::_dlistWidthInit = 50;
57
int DrumEdit::_dcanvasWidthInit = 300;
55
59
static const int xscale = -10;
56
60
static const int yscale = 1;
61
static const int drumeditTools = PointerTool | PencilTool | RubberTool;
58
63
//---------------------------------------------------------
59
64
// DWhatsThis::text
64
69
int section = header->sectionAt(pos.x());
68
case 0: return header->tr("mute instrument"); break;
69
case 1: return header->tr("sound name"); break;
70
case 2: return header->tr("quantisation"
71
"\ncurrently not used"); break;
72
case 3: return header->tr("this input note triggers the sound"); break;
73
case 4: return header->tr("note length"); break;
74
case 5: return header->tr("this note is send for the sound"); break;
75
case 6: return header->tr("output channel"
76
"\ncurrently not used"); break;
77
case 7: return header->tr("output port"
78
"\ncurrently not used"); break;
79
case 8: return header->tr("velocity level 1"); break;
80
case 9: return header->tr("velocity level 2"); break;
81
case 10: return header->tr("velocity level 3"); break;
82
case 11: return header->tr("velocity level 4"); break;
73
case 0: return QHeader::tr("mute instrument"); break;
74
case 1: return QHeader::tr("sound name"); break;
75
case 2: return QHeader::tr("quantisation"
76
"\ncurrently not used"); break;
77
case 3: return QHeader::tr("this input note triggers the sound"); break;
78
case 4: return QHeader::tr("note length"); break;
79
case 5: return QHeader::tr("this note is send for the sound"); break;
80
case 6: return QHeader::tr("output channel"
81
"\ncurrently not used"); break;
82
case 7: return QHeader::tr("output port"
83
"\ncurrently not used"); break;
84
case 8: return QHeader::tr("velocity level 1"); break;
85
case 9: return QHeader::tr("velocity level 2"); break;
86
case 10: return QHeader::tr("velocity level 3"); break;
87
case 11: return QHeader::tr("velocity level 4"); break;
88
93
//---------------------------------------------------------
101
106
switch(section) {
102
case 0: p = w->tr("mute instrument"); break;
103
case 1: p = w->tr("sound name"); break;
104
case 2: p = w->tr("quantisation"); break;
105
case 3: p = w->tr("this input note triggers the sound"); break;
106
case 4: p = w->tr("note length"); break;
107
case 5: p = w->tr("this note is send for the sound"); break;
108
case 6: p = w->tr("output channel"); break;
109
case 7: p = w->tr("output port"); break;
110
case 8: p = w->tr("velocity level 1"); break;
111
case 9: p = w->tr("velocity level 2"); break;
112
case 10: p = w->tr("velocity level 3"); break;
113
case 11: p = w->tr("velocity level 4"); break;
107
case 0: p = QHeader::tr("mute instrument"); break;
108
case 1: p = QHeader::tr("sound name"); break;
109
case 2: p = QHeader::tr("quantisation"); break;
110
case 3: p = QHeader::tr("this input note triggers the sound"); break;
111
case 4: p = QHeader::tr("note length"); break;
112
case 5: p = QHeader::tr("this note is send for the sound"); break;
113
case 6: p = QHeader::tr("output channel"); break;
114
case 7: p = QHeader::tr("output port"); break;
115
case 8: p = QHeader::tr("velocity level 1"); break;
116
case 9: p = QHeader::tr("velocity level 2"); break;
117
case 10: p = QHeader::tr("velocity level 3"); break;
118
case 11: p = QHeader::tr("velocity level 4"); break;
123
128
void DrumEdit::closeEvent(QCloseEvent* e)
130
//Store values of the horizontal splitter
131
QValueList<int> sizes = split2->sizes();
132
QValueList<int>::Iterator it = sizes.begin();
133
_dlistWidthInit = *it; //There are only 2 values stored in the sizelist, size of dlist widget and dcanvas widget
135
_dcanvasWidthInit = *it;
125
136
emit deleted((int)this);
131
142
//---------------------------------------------------------
133
DrumEdit::DrumEdit(PartList* pl, QWidget* parent = 0, const char* name = 0)
144
DrumEdit::DrumEdit(PartList* pl, QWidget* parent, const char* name)
134
145
: MidiEditor(_quantInit, _rasterInit, pl, parent, name)
147
resize(_widthInit, _heightInit);
138
150
//---------Pulldown Menu----------------------------
139
151
QPopupMenu* menuFile = new QPopupMenu(this);
140
menuBar()->insertItem("&File", menuFile);
152
menuBar()->insertItem(tr("&File"), menuFile);
142
154
menuFile->insertItem(*openIcon, tr("Load Map"), DrumCanvas::CMD_LOAD);
143
155
menuFile->setAccel(CTRL+Key_O, DrumCanvas::CMD_LOAD);
147
159
menuEdit = new QPopupMenu(this);
148
160
menuBar()->insertItem(tr("&Edit"), menuEdit);
161
undoRedo->addTo(menuEdit);
162
QAccel* qa = new QAccel(this);
163
qa->connectItem(qa->insertItem(CTRL+Key_Z), song, SLOT(undo()));
164
menuEdit->insertSeparator();
149
165
menuEdit->insertItem(tr("Cut"), DrumCanvas::CMD_CUT);
150
166
menuEdit->setAccel(CTRL+Key_X, DrumCanvas::CMD_CUT);
151
167
menuEdit->insertItem(tr("Copy"), DrumCanvas::CMD_COPY);
154
170
menuEdit->setAccel(CTRL+Key_V, DrumCanvas::CMD_PASTE);
155
171
menuEdit->insertSeparator();
156
172
menuEdit->insertItem(tr("Delete Events"), DrumCanvas::CMD_DEL);
173
menuEdit->setAccel(Key_Delete, DrumCanvas::CMD_DEL);
157
174
menuEdit->insertSeparator();
175
menuEdit->insertItem(tr("Set fixed length"), DrumCanvas::CMD_FIXED_LEN);
176
menuEdit->setAccel(ALT+Key_L, DrumCanvas::CMD_FIXED_LEN);
159
178
QPopupMenu* menuSelect = new QPopupMenu(this);
160
179
menuSelect->insertItem(tr("Select All"), DrumCanvas::CMD_SELECT_ALL);
174
193
//---------------------------------------------------
176
195
tools = new QToolBar(this, "drum-tools");
177
new QToolButton(*openIcon, "Load Drummap",
178
QString::null, this, SLOT(load()),
179
tools, "load drummap from file");
196
new QToolButton(*openIcon, tr("Load Drummap"),
197
QString::null, this, SLOT(load()),
198
tools, "load drummap from file");
181
new QToolButton(*saveIcon, "Store Drummap",
184
tools, "store drummap to file");
200
new QToolButton(*saveIcon, tr("Store Drummap"),
203
tools, "store drummap to file");
186
205
QWhatsThis::whatsThisButton(tools);
199
218
midiin->setPixmap(*midiinIcon);
200
219
midiin->setToggleButton(true);
202
EditToolBar* etb = new EditToolBar(this,
203
PointerTool | PencilTool | RubberTool);
221
tools2 = new EditToolBar(this, drumeditTools);
205
new TransportToolbar(this);
223
QToolBar* transport = new QToolBar(this);
224
transportAction->addTo(transport);
207
226
// dont�t show pitch value in toolbar
208
227
toolbar = new Toolbar1(this, _rasterInit, _quantInit, false);
213
232
//---------------------------------------------------
215
234
split1 = new Splitter(Vertical, mainw, "split1");
216
QPushButton* ctrl = new QPushButton("ctrl", mainw, "Ctrl");
235
QPushButton* ctrl = new QPushButton(tr("ctrl"), mainw, "Ctrl");
236
ctrl->setFont(font3);
217
237
hscroll = new ScrollScale(-25, -2, xscale, 20000, Horizontal, mainw);
218
238
ctrl->setFixedSize(50, hscroll->sizeHint().height());
219
239
QToolTip::add(ctrl, tr("Add Controller View"));
221
241
QSizeGrip* corner = new QSizeGrip(mainw);
242
corner->setFixedHeight(hscroll->sizeHint().height());
223
244
mainGrid->setRowStretch(0, 100);
224
245
mainGrid->setColStretch(1, 100);
225
247
mainGrid->addMultiCellWidget(split1, 0, 0, 0, 2);
226
248
mainGrid->addWidget(ctrl, 1, 0);
227
249
mainGrid->addWidget(hscroll, 1, 1);
228
250
mainGrid->addWidget(corner, 1, 2, AlignBottom|AlignRight);
229
mainGrid->addRowSpacing(1, hscroll->sizeHint().height());
251
// mainGrid->addRowSpacing(1, hscroll->sizeHint().height());
231
253
split2 = new Splitter(Horizontal, split1, "split2");
232
254
QWidget* split1w1 = new QWidget(split2, "split1w1");
238
260
vscroll = new ScrollScale(1, 5, yscale, DRUM_MAPSIZE*TH, Vertical, split1w2);
239
261
int offset = -(division/4);
240
262
canvas->setOrigin(offset, 0);
263
canvas->setCanvasTools(drumeditTools);
265
connect(canvas, SIGNAL(toolChanged(int)), tools2, SLOT(set(int)));
241
267
time->setOrigin(offset, 0);
242
268
vscroll->showMag(false);
244
270
QValueList<int> mops;
271
mops.append(_dlistWidthInit);
272
mops.append(_dcanvasWidthInit);
247
273
split2->setSizes(mops);
249
275
gridS2->setRowStretch(1, 100);
276
302
dlist = new DList(header, split1w1, yscale);
277
303
connect(dlist, SIGNAL(keyPressed(int, bool)), canvas, SLOT(keyPressed(int, bool)));
278
304
connect(dlist, SIGNAL(keyReleased(int, bool)), canvas, SLOT(keyReleased(int, bool)));
279
connect(dlist, SIGNAL(mapChanged()), canvas, SLOT(mapChanged()));
305
connect(dlist, SIGNAL(mapChanged(int, int)), canvas, SLOT(mapChanged(int, int)));
306
connect(dlist, SIGNAL(selectionChanged(DrumMap*)), SLOT(dlistSelectionChanged(DrumMap*)));
281
308
gridS1->setRowStretch(1, 100);
282
309
gridS1->setColStretch(0, 100);
286
313
connect(canvas, SIGNAL(newWidth(int)), SLOT(newCanvasWidth(int)));
287
314
connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
315
connect(song, SIGNAL(songChanged(int)), dlist, SLOT(songChanged(int)));
288
316
connect(vscroll, SIGNAL(scrollChanged(int)), canvas, SLOT(setYPos(int)));
289
317
connect(hscroll, SIGNAL(scrollChanged(int)), canvas, SLOT(setXPos(int)));
290
318
connect(hscroll, SIGNAL(scaleChanged(int)), canvas, SLOT(setXMag(int)));
295
323
connect(hscroll, SIGNAL(scrollChanged(int)), time, SLOT(setXPos(int)));
296
324
connect(hscroll, SIGNAL(scaleChanged(int)), time, SLOT(setXMag(int)));
298
connect(etb, SIGNAL(toolChanged(int)), canvas, SLOT(setTool(int)));
299
// connect(etb, SIGNAL(toolChanged(int)), ctrlCanvas, SLOT(setTool(int)));
326
connect(tools2, SIGNAL(toolChanged(int)), canvas, SLOT(setTool(int)));
301
328
connect(canvas, SIGNAL(selectionChanged(int, Event*, Part*)), this,
302
329
SLOT(setSelection(int, Event*, Part*)));
388
414
void DrumEdit::soloChanged(bool flag)
390
song->setSolo(flag ? canvas->track() : 0);
393
void DrumEdit::soloChanged(Track* t)
395
toolbar->setSolo(t == canvas->track());
416
canvas->track()->node()->setSolo(flag);
419
void DrumEdit::soloChanged(SNode* t)
421
toolbar->setSolo(t == canvas->track()->node());
425
void DrumEdit::dlistSelectionChanged(DrumMap* dm)
427
QString name = dm->name;
398
429
//---------------------------------------------------------
400
431
//---------------------------------------------------------
557
586
_quantInit = xml.parseInt();
558
587
else if (tag == "raster")
559
588
_rasterInit = xml.parseInt();
589
else if (tag == "width")
590
_widthInit = xml.parseInt();
591
else if (tag == "height")
592
_heightInit = xml.parseInt();
593
else if (tag == "dcanvaswidth")
594
_dcanvasWidthInit = xml.parseInt();
595
else if (tag == "dlistwidth")
596
_dlistWidthInit = xml.parseInt();
561
598
xml.unknown("DrumEdit");
579
616
xml.tag(level++, "drumedit");
580
617
xml.intTag(level, "quant", _quantInit);
581
618
xml.intTag(level, "raster", _rasterInit);
619
xml.intTag(level, "width", _widthInit);
620
xml.intTag(level, "height", _heightInit);
621
xml.intTag(level, "dlistwidth", _dlistWidthInit);
622
xml.intTag(level, "dcanvaswidth", _dcanvasWidthInit);
582
623
xml.tag(level, "/drumedit");
589
630
void DrumEdit::load()
591
QString fn = getOpenFileName("drummaps", map_file_pattern,
592
this, "Muse: Load Drum Map");
632
QString fn = getOpenFileName(tr("drummaps"), map_file_pattern,
633
this, tr("Muse: Load Drum Map"));
593
634
if (fn.isEmpty())
596
FILE* f = fileOpen(this, fn, ".map", "r", popenFlag, true);
637
FILE* f = fileOpen(this, fn, QString(".map"), "r", popenFlag, true);
641
682
void DrumEdit::save()
643
QString fn = getSaveFileName("drummaps", map_file_pattern,
644
this, "MusE: Store Drum Map");
684
QString fn = getSaveFileName(QString("drummaps"), map_file_pattern,
685
this, tr("MusE: Store Drum Map"));
645
686
if (fn.isEmpty())
648
FILE* f = fileOpen(this, fn, ".map", "w", popenFlag, false, true);
689
FILE* f = fileOpen(this, fn, QString(".map"), "w", popenFlag, false, true);
687
728
void DrumEdit::clipboardChanged()
689
QMimeSource* ms = QApplication::clipboard()->data();
730
QMimeSource* ms = QApplication::clipboard()->data(QClipboard::Clipboard);
690
731
if (ms && ms->format(0)) {
691
732
bool flag = strcmp(ms->format(0), "text/eventlist;charset=UTF-8") == 0;
692
733
menuEdit->setItemEnabled(DrumCanvas::CMD_PASTE, flag);
717
758
connect(ctrlEdit, SIGNAL(timeChanged(int)), SLOT(setTime(int)));
718
759
connect(ctrlEdit, SIGNAL(destroyedCtrl(CtrlEdit*)), SLOT(removeCtrl(CtrlEdit*)));
719
760
connect(ctrlEdit, SIGNAL(yposChanged(int)), toolbar, SLOT(setInt(int)));
761
connect(tools2, SIGNAL(toolChanged(int)), ctrlEdit, SLOT(setTool(int)));
762
connect(dlist, SIGNAL(keyFilterChanged(const char )), ctrlEdit, SLOT(setKeyfilter(const char )));
764
int curSelectedInstrument = dlist->getSelectedInstrument();
765
if (curSelectedInstrument != -1)
766
ctrlEdit->setKeyfilter((char)curSelectedInstrument);
721
768
ctrlEdit->setXPos(hscroll->pos());
722
769
ctrlEdit->setXMag(hscroll->getScaleValue());
805
//---------------------------------------------------------
807
//---------------------------------------------------------
809
void DrumEdit::resizeEvent(QResizeEvent* ev)
811
QWidget::resizeEvent(ev);
812
_widthInit = ev->size().width();
813
_heightInit = ev->size().height();
815
//TODO: Make the dlist not expand/shrink, but the canvas instead