1
//=========================================================
4
// $Id: mixer.cpp,v 1.1 2002/01/30 12:08:38 muse Exp $
5
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
6
//=========================================================
15
#include <qsignalmapper.h>
17
#include <qpushbutton.h>
29
#define CTRL 4 // number of controller values in mixer
31
//---------------------------------------------------------
33
//---------------------------------------------------------
35
Mixer::Mixer() : TopWin(0, "MidiMixer", WType_TopLevel)
37
setCaption("MusE: Midi Mixer");
38
const char* ctrlLabels[CTRL] = { "Rev", "Cho", "Var", "Pan" };
41
TrackList* tracks = song->tracks();
42
bool used[MIDI_CHANNELS*MIDI_PORTS];
43
for (int i = 0; i < MIDI_CHANNELS*MIDI_PORTS; ++i)
45
for (iTrack it = tracks->begin(); it != tracks->end(); ++it) {
46
MidiTrack* track = dynamic_cast<MidiTrack*>(*it);
49
int port = track->outPort();
50
int channel = track->outChannel();
51
used[channel + MIDI_CHANNELS * port] = true;
54
for (int port = 0; port < MIDI_PORTS; ++port) {
55
for (int channel = 0; channel < MIDI_CHANNELS; ++channel) {
56
if (used[channel + MIDI_CHANNELS * port]) {
57
MixerLine* line = new MixerLine;
59
line->channel = channel;
60
line->index = channels++;
61
lines.push_back(line);
66
QWidget* w = new QWidget(this, "main");
69
QSignalMapper* mapper = new QSignalMapper(this);
70
connect(mapper, SIGNAL(mapped(int)), this, SLOT(valChanged(int)));
72
QGridLayout* grid = new QGridLayout(w);
73
grid->setRowStretch(4+CTRL*2, 20);
75
grid->addMultiCellWidget(hLine(w), 0, 0, 0, channels*2);
76
grid->addMultiCellWidget(hLine(w), 2, 2, 0, channels*2);
78
for (iMixerLine i = lines.begin(); i != lines.end(); ++i) {
83
sprintf(buffer, "Ch%d", (*i)->channel + 1);
84
QLabel* cl = new QLabel(buffer, w);
85
cl->setAlignment(AlignCenter);
86
grid->addWidget(cl, 1, index*2);
87
grid->addWidget(vLine(w), 1, index*2+1);
89
sprintf(buffer, "P %d", (*i)->port + 1);
90
QLabel* pl = new QLabel(buffer, w);
91
pl->setAlignment(AlignCenter);
92
grid->addWidget(pl, 3, index*2);
93
grid->addWidget(hLine(w), 4, index*2);
95
grid->addMultiCellWidget(vLine(w), 3, 6+CTRL*2, index*2+1, index*2+1);
97
IntLabel** dials[CTRL] = {
98
&l->reverb, &l->chorus, &l->variation, &l->panpos
100
for (int k = 0; k < CTRL; ++k) {
101
*dials[k] = new IntLabel(-1, -1, 127, w, -1);
102
(*dials[k])->setFixedWidth(32);
103
mapper->setMapping(*dials[k], (k<<8)+index);
104
connect(*dials[k], SIGNAL(valueChanged(int)), mapper, SLOT(map()));
105
grid->addWidget(*dials[k], 5+k*2, index*2);
106
grid->addWidget(hLine(w), 6+k*2, index*2);
108
l->mute = new QPushButton(w);
109
l->mute->setPixmap(*dot1Icon);
110
l->mute->setToggleButton(true);
111
grid->addWidget(l->mute, 5+CTRL*2, index*2);
112
mapper->setMapping(l->mute, 4*256+index);
113
connect(l->mute, SIGNAL(toggled(bool)), mapper, SLOT(map()));
115
l->volume = new QSlider(0, 127, 1, 127, Vertical, w);
116
l->volume->setTickmarks(QSlider::Right);
117
l->volume->setTickInterval(32);
118
mapper->setMapping(l->volume, 5*256+index);
119
connect(l->volume, SIGNAL(valueChanged(int)), mapper, SLOT(map()));
120
grid->addWidget(l->volume, 6 + CTRL*2, index*2);
123
//---------------------------------------------------
125
//---------------------------------------------------
127
QLabel* cl = new QLabel("Master", w, "chl");
128
grid->addWidget(cl, 1, channels*2);
130
QLabel* cp = new QLabel("Port", w);
131
cp->setAlignment(AlignCenter);
132
grid->addWidget(cp, 3, channels*2);
133
grid->addWidget(hLine(w), 4, channels*2);
135
for (int k = 0; k < CTRL; ++k) {
136
QLabel* l1 = new QLabel(ctrlLabels[k], w);
137
l1->setAlignment(AlignCenter);
138
grid->addWidget(l1, 5+k*2, channels*2);
139
grid->addWidget(hLine(w), 6+k*2, channels*2);
141
QLabel* l2 =new QLabel(tr("Mute"), w);
142
grid->addWidget(l2, 5+CTRL*2, channels*2);
144
master = new QSlider(0, 16383, 1, 16383, Vertical, w);
145
master->setTickmarks(QSlider::Right);
146
master->setTickInterval(2048);
147
master->setValue(16383 - midiPorts[0].masterVol());
149
grid->addWidget(master, 6+CTRL*2, channels*2);
150
connect(master, SIGNAL(valueChanged(int)), this, SLOT(masterChanged(int)));
151
grid->setColStretch(channels*2+1, 20);
152
updateValues(false); // set init values
153
setFixedWidth((channels+1) * (32+5));
156
//---------------------------------------------------------
158
//---------------------------------------------------------
160
void Mixer::valChanged(int p)
163
int index = p & 0xff;
165
for (i = lines.begin(); i != lines.end(); ++i) {
166
if ((*i)->index == index)
169
assert(i != lines.end());
171
int channel = l->channel;
176
val = l->reverb->value();
177
emit ctrlChanged(port, channel, 0x5b, val);
180
val = l->chorus->value();
181
emit ctrlChanged(port, channel, 0x5d, val);
184
val = l->variation->value();
185
emit ctrlChanged(port, channel, 0x5e, val);
188
val = l->panpos->value();
189
emit ctrlChanged(port, channel, 0x0a, val);
192
val = l->mute->isOn();
193
l->mute->setPixmap(val ? *muteIcon : *dot1Icon);
194
song->setChannelMute(channel, val);
197
val = 127 - l->volume->value();
198
emit ctrlChanged(port, channel, 0x7, val);
201
printf("valChanged:interner Fehler type=%d\n", type);
206
//---------------------------------------------------------
208
//---------------------------------------------------------
210
void Mixer::masterChanged(int val)
212
emit masterVolChanged(16383-val);
215
//---------------------------------------------------------
217
//---------------------------------------------------------
219
void Mixer::closeEvent(QCloseEvent* e)
221
emit deleted((int)this);
225
//---------------------------------------------------------
227
//---------------------------------------------------------
229
void Mixer::updateValues(bool current=true)
231
for (iMixerLine i = lines.begin(); i != lines.end(); ++i) {
233
MidiPort* port = &midiPorts[l->port];
234
ChannelState* state = current ? port->cState(l->channel) : port->iState(l->channel);
235
int val = state->controller[CTRL_VOLUME];
236
if (val != 127-l->volume->value())
237
l->volume->setValue(127 - val);
238
val = state->controller[CTRL_CHORUS_SEND];
239
if (val != l->chorus->value())
240
l->chorus->setValue(val);
241
val = state->controller[CTRL_REVERB_SEND];
242
if (val != l->reverb->value())
243
l->reverb->setValue(val);
244
val = state->controller[CTRL_VARIATION_SEND];
245
if (val != l->variation->value())
246
l->variation->setValue(val);
247
val = state->controller[CTRL_PANPOT];
248
if (val != l->panpos->value())
249
l->panpos->setValue(val);
253
//---------------------------------------------------------
255
//---------------------------------------------------------
257
void Mixer::readStatus(Xml& xml)
261
Xml::Token token = xml.parse();
262
const QString& tag = xml.s1();
269
TopWin::readStatus(xml);
271
xml.unknown("MidiMixer");
274
if (tag == "midimixer")
282
//---------------------------------------------------------
284
//---------------------------------------------------------
286
void Mixer::writeStatus(int level, Xml& xml) const
288
xml.tag(level++, "midimixer");
289
TopWin::writeStatus(level, xml);
290
xml.tag(level, "/midimixer");