|
|
|
/**************************************************************************
|
|
|
|
|
|
|
|
channel.cpp - The KMidChannel widget (with pure virtual members)
|
|
|
|
Copyright (C) 1998 Antonio Larrosa Jimenez
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
|
|
|
|
Send comments and bug fixes to larrosa@kde.org
|
|
|
|
or to Antonio Larrosa, Rio Arnoya, 10 5B, 29006 Malaga, Spain
|
|
|
|
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <tqpainter.h>
|
|
|
|
#include <tqcombobox.h>
|
|
|
|
|
|
|
|
#include <kglobal.h>
|
|
|
|
#include <kinstance.h>
|
|
|
|
#include <kconfig.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kstandarddirs.h>
|
|
|
|
#include "kmidbutton.h"
|
|
|
|
|
|
|
|
#include "channel.h"
|
|
|
|
#include "instrname.h"
|
|
|
|
#include <kiconloader.h>
|
|
|
|
|
|
|
|
KMidChannel::KMidChannel(int chn,TQWidget *parent) : TQWidget (parent)
|
|
|
|
{
|
|
|
|
channel=chn;
|
|
|
|
replay=TRUE;
|
|
|
|
int i;
|
|
|
|
for (i=0;i<128;i++) pressed[i]=0;
|
|
|
|
keyboard = TQPixmap(locate("appdata","icons/keyboard.xpm"));
|
|
|
|
penB = new TQPen (black);
|
|
|
|
penW = new TQPen (white);
|
|
|
|
penT = new TQPen (colorGroup().background());
|
|
|
|
|
|
|
|
KConfig *kcfg=KGlobal::instance()->config();
|
|
|
|
kcfg->setGroup("KMid");
|
|
|
|
TQFont *qtextfontdefault=new TQFont("lucida",18,TQFont::Bold,TRUE);
|
|
|
|
qcvfont=new TQFont(kcfg->readFontEntry("ChannelViewFont",qtextfontdefault));
|
|
|
|
delete qtextfontdefault;
|
|
|
|
|
|
|
|
instrumentCombo = new TQComboBox(FALSE,this,"instr");
|
|
|
|
instrumentCombo->setGeometry(160,2,200,20);
|
|
|
|
|
|
|
|
for (i=0;i<128;i++)
|
|
|
|
instrumentCombo->insertItem(i18n(instrumentName[i]),i);
|
|
|
|
|
|
|
|
connect(instrumentCombo,TQT_SIGNAL(activated(int)),this,TQT_SLOT(pgmChanged(int)));
|
|
|
|
|
|
|
|
forcepgm=new KMidButton(this,"forcepgm");
|
|
|
|
forcepgm->setGeometry(135,4,16,16);
|
|
|
|
forcepgm->setToggleButton(TRUE);
|
|
|
|
button1 = TQPixmap(locate("appdata","icons/button1.xpm"));
|
|
|
|
button2 = TQPixmap(locate("appdata","icons/button2.xpm"));
|
|
|
|
forcepgm->setPixmaps(button1,button2);
|
|
|
|
forcepgm->show();
|
|
|
|
connect(forcepgm,TQT_SIGNAL(toggled(bool)),this,TQT_SLOT(changeForcedState(bool)));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
KMidChannel::~KMidChannel()
|
|
|
|
{
|
|
|
|
delete penB;
|
|
|
|
delete penW;
|
|
|
|
delete penT;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::paintEvent( TQPaintEvent * )
|
|
|
|
{
|
|
|
|
|
|
|
|
TQPainter *qpaint=new TQPainter(this);
|
|
|
|
|
|
|
|
TQString tmp = i18n("Channel %1").arg(channel);
|
|
|
|
qpaint->setFont(*qcvfont);
|
|
|
|
qpaint->setPen(*penB);
|
|
|
|
qpaint->drawText(2,20,tmp);
|
|
|
|
qpaint->setPen(*penW);
|
|
|
|
qpaint->drawText(0,18,tmp);
|
|
|
|
|
|
|
|
drawKeyboard(qpaint);
|
|
|
|
drawPressedKeys(qpaint);
|
|
|
|
|
|
|
|
delete qpaint;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::drawKeyboard(TQPainter *qpaint)
|
|
|
|
{
|
|
|
|
int x=1;
|
|
|
|
for (int i=0;(i<12) && (x<width());i++,x+=63)
|
|
|
|
{
|
|
|
|
qpaint->drawPixmap(x,KEYBOARDY,keyboard);
|
|
|
|
};
|
|
|
|
qpaint->setPen(*penB);
|
|
|
|
qpaint->drawLine(0,KEYBOARDY,0,KEYBOARDY+44);
|
|
|
|
|
|
|
|
qpaint->setPen(*penT);
|
|
|
|
qpaint->drawLine(0,KEYBOARDY+45,x+63,KEYBOARDY+45);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::drawPressedKeys(TQPainter *qpaint)
|
|
|
|
{
|
|
|
|
for (int i=0;i<128;i++)
|
|
|
|
if (pressed[i]) drawKey(qpaint,i);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::drawKey(TQPainter *qpaint,int key)
|
|
|
|
{
|
|
|
|
int octave=key/12;
|
|
|
|
int note=key%12;
|
|
|
|
int x=octave*63+1;
|
|
|
|
|
|
|
|
switch (note)
|
|
|
|
{
|
|
|
|
case (0) : drawDo (qpaint,x,pressed[key]);break;
|
|
|
|
case (1) : drawDo__ (qpaint,x,pressed[key]);break;
|
|
|
|
case (2) : drawRe (qpaint,x,pressed[key]);break;
|
|
|
|
case (3) : drawRe__ (qpaint,x,pressed[key]);break;
|
|
|
|
case (4) : drawMi (qpaint,x,pressed[key]);break;
|
|
|
|
case (5) : drawFa (qpaint,x,pressed[key]);break;
|
|
|
|
case (6) : drawFa__ (qpaint,x,pressed[key]);break;
|
|
|
|
case (7) : drawSol (qpaint,x,pressed[key]);break;
|
|
|
|
case (8) : drawSol__(qpaint,x,pressed[key]);break;
|
|
|
|
case (9) : drawLa (qpaint,x,pressed[key]);break;
|
|
|
|
case (10) : drawLa__ (qpaint,x,pressed[key]);break;
|
|
|
|
case (11) : drawSi (qpaint,x,pressed[key]);break;
|
|
|
|
};
|
|
|
|
// qpaint->flush();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::noteOn(int key)
|
|
|
|
{
|
|
|
|
pressed[key]=1;
|
|
|
|
TQPainter *qpaint=new TQPainter(this);
|
|
|
|
drawKey(qpaint,key);
|
|
|
|
delete qpaint;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::noteOff(int key)
|
|
|
|
{
|
|
|
|
pressed[key]=0;
|
|
|
|
TQPainter *qpaint=new TQPainter(this);
|
|
|
|
drawKey(qpaint,key);
|
|
|
|
delete qpaint;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::changeInstrument(int pgm)
|
|
|
|
{
|
|
|
|
instrumentCombo->setCurrentItem(pgm);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::changeForceState(bool i)
|
|
|
|
{
|
|
|
|
replay=FALSE;
|
|
|
|
forcepgm->setOn(i);
|
|
|
|
replay=TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::reset(int level)
|
|
|
|
{
|
|
|
|
for (int i=0;i<128;i++) pressed[i]=0;
|
|
|
|
if (level>=1)
|
|
|
|
{
|
|
|
|
instrumentCombo->setCurrentItem(0);
|
|
|
|
replay=FALSE;
|
|
|
|
forcepgm->setOn(FALSE);
|
|
|
|
replay=TRUE;
|
|
|
|
};
|
|
|
|
|
|
|
|
repaint(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::saveState(bool *p,int *pgm)
|
|
|
|
{
|
|
|
|
for (int i=0;i<128;i++) p[i]=pressed[i];
|
|
|
|
*pgm=instrumentCombo->currentItem();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::loadState(bool *p,int *pgm)
|
|
|
|
{
|
|
|
|
for (int i=0;i<128;i++) pressed[i]=p[i];
|
|
|
|
instrumentCombo->setCurrentItem(*pgm);
|
|
|
|
repaint(FALSE);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KMidChannel::pgmChanged(int i)
|
|
|
|
{
|
|
|
|
int data[4];
|
|
|
|
data[0]=CHN_CHANGE_PGM;
|
|
|
|
data[1]=channel;
|
|
|
|
data[2]=i;
|
|
|
|
data[3]=0;
|
|
|
|
|
|
|
|
replay=FALSE;
|
|
|
|
forcepgm->setOn(TRUE);
|
|
|
|
replay=TRUE;
|
|
|
|
|
|
|
|
emit signalToKMidClient(data);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void KMidChannel::changeForcedState(bool i)
|
|
|
|
{
|
|
|
|
int data[4];
|
|
|
|
data[0]=CHN_CHANGE_FORCED_STATE;
|
|
|
|
data[1]=channel;
|
|
|
|
data[2]=i;
|
|
|
|
data[3]=(replay)? 1 : 0;
|
|
|
|
|
|
|
|
emit signalToKMidClient(data);
|
|
|
|
|
|
|
|
}
|
|
|
|
#include "channel.moc"
|