00001 #include "fretboard.h"
00002
00003
00004 #include <opie2/odebug.h>
00005 using namespace Opie::Core;
00006
00007
00008 #include <qpainter.h>
00009
00010 Graph::FretBoard::FretBoard(TonleiterData* data,QWidget* parent,const char* name,WFlags f)
00011 :QWidget(parent,name,f),data(data)
00012 {
00013 setBackgroundColor(QColor(0,0,0));
00014 fretpen=QPen(QColor(155,155,155),0);
00015 markerbrush=QBrush(QColor(155,155,155));
00016 stringpen=QPen(QColor(255,255,255),3);
00017 connect(data,SIGNAL(dataChange()),this,SLOT(dataChange()));
00018 }
00019
00020 Graph::FretBoard::~FretBoard()
00021 {
00022 }
00023
00024 void Graph::FretBoard::dataChange()
00025 {
00026 repaint(true);
00027 }
00028
00029 void Graph::FretBoard::paintEvent(QPaintEvent* pe)
00030 {
00031 Q_UNUSED(pe);
00032
00033 int instid=data->getCurrentInstrumentID();
00034 inst=data->getInstrument(instid);
00035
00036
00037 QRect mysize=rect();
00038
00039 xmargin=(int)(mysize.width()*0.05);
00040 xmin=2*xmargin;
00041 xmax=mysize.width()-xmargin;
00042 xwidth=xmax-xmin;
00043
00044 ymargin=(int)(mysize.height()*0.1);
00045 ymin=ymargin;
00046 ymax=mysize.height()-2*ymargin;
00047 yheight=ymax-ymin;
00048
00049 QPainter p(this);
00050 paintBoard(&p);
00051 paintFrets(&p);
00052 paintStrings(&p);
00053 paintScale(&p);
00054 }
00055
00056 void Graph::FretBoard::resizeEvent(QResizeEvent* re)
00057 {
00058 Q_UNUSED(re);
00059 }
00060
00061 void Graph::FretBoard::mouseReleaseEvent(QMouseEvent* me)
00062 {
00063 Q_UNUSED(me);
00064 emit pressed();
00065 }
00066
00067 void Graph::FretBoard::paintBoard(QPainter* p)
00068 {
00069
00070 QColor bgc=QColor(142,138,120);
00071 p->setPen(QPen(bgc,5));
00072 p->setBrush(QBrush(bgc));
00073 p->drawRect(xmin,ymin,xwidth,yheight);
00074
00075 }
00076
00077 void Graph::FretBoard::paintFrets(QPainter* p)
00078 {
00079
00080 p->setPen(fretpen);
00081 p->setBrush(markerbrush);
00082 fretdist=(double)(xwidth)/(double)(inst.noOfFrets());
00083
00084 int markerwidth = (int)(fretdist/4.0);
00085 if(markerwidth>5)
00086 markerwidth=5;
00087 else if(markerwidth<2)
00088 markerwidth=2;
00089
00090 for(int f=0;f<=inst.noOfFrets();f++)
00091 {
00092 int fretpos=(int)(fretdist*f);
00093 p->drawLine(fretpos+xmin,ymin,fretpos+xmin,ymax);
00094
00095 int above_octave=f%12;
00096 int octave=(f-above_octave)/12;
00097 int marker=f-12*octave;
00098
00099
00100 if(marker==5 || marker==7 || marker==9)
00101 {
00102 p->drawEllipse(fretpos+xmin,ymax+ymargin,markerwidth,markerwidth);
00103 }
00104 else if(marker==0 && f!=0)
00105 {
00106 p->drawEllipse(fretpos+xmin,ymax+ymargin+2*markerwidth,markerwidth,markerwidth);
00107 p->drawEllipse(fretpos+xmin,ymax+ymargin-2*markerwidth,markerwidth,markerwidth);
00108 }
00109
00110 }
00111 }
00112
00113 void Graph::FretBoard::paintStrings(QPainter* p)
00114 {
00115
00116 p->setPen(stringpen);
00117
00118 stringdist=(double)(yheight)/(double)(inst.noOfStrings()-1);
00119 for(int s=0;s<inst.noOfStrings();s++)
00120 {
00121 int stringpos=(int)(stringdist*s);
00122 p->drawLine(xmin,stringpos+ymin,xmax,stringpos+ymin);
00123
00124 int stinglabelid=inst.noOfStrings()-(s+1);
00125 QString label=Note::getNameOfNote(inst.string(stinglabelid));
00126 p->drawText(xmargin/2,stringpos+ymin,label);
00127 }
00128 }
00129
00130 void Graph::FretBoard::paintScale(QPainter* p)
00131 {
00132 int dotsize=10;
00133 int scaleid=data->getCurrentScaleID();
00134 Scale scale=data->getScale(scaleid);
00135 int baseoctave=Note::octaveOfBaseNote(data->getCurrentBaseNote(),inst.lowestNote());
00136
00137 for(int s=0;s<inst.noOfStrings();s++)
00138 {
00139 int y=(int)(stringdist*s)+ymin;
00140 int stingid=inst.noOfStrings()-(s+1);
00141 for(int f=0;f<=inst.noOfFrets();f++)
00142 {
00143 int note=inst.string(stingid)+f;
00144 if(scale.noteInScale(data->getCurrentBaseNote(),note))
00145 {
00146 int x=(int)(fretdist*f)+xmin;
00147
00148
00149 int octave=Note::octaveOfBaseNote(data->getCurrentBaseNote(),note)-baseoctave;
00150 if(octave<0)
00151 odebug << "" << octave << "," << baseoctave << "" << oendl;
00152 if(octave>5)
00153 {
00154 odebug << "octave out of range" << oendl;
00155 octave=5;
00156 }
00157
00158 p->setPen(QColor(255,0,0));
00159 int c= ( (note-12*baseoctave) - (12*octave+data->getCurrentBaseNote()) )*15;
00160 if(c<0 || c>255)
00161 odebug << "" << c << " = " << note << " - ( " << 12*octave << " + " << data->getCurrentBaseNote() << ")" << oendl;
00162 QColor dotcolor(255,255,255);
00163
00164 if(octave==0)
00165 dotcolor=QColor(c,c,255);
00166 else if(octave==1)
00167 dotcolor=QColor(c,255,c);
00168 else if(octave==2)
00169 dotcolor=QColor(255,c,c);
00170 else if(octave==3)
00171 dotcolor=QColor(255,255,c);
00172 else if(octave==4)
00173 dotcolor=QColor(255,c,255);
00174 else
00175 dotcolor=QColor(c,255,255);
00176
00177 p->setBrush(dotcolor);
00178 p->drawEllipse(x-dotsize/2,y-dotsize/2,dotsize,dotsize);
00179
00180 if(data->isDrawNames())
00181 {
00182 p->setPen(QColor(255,155,0));
00183 p->drawText(x-dotsize/2,y-dotsize/2,Note::getNameOfNote(note));
00184 }
00185
00186 }
00187 }
00188 }
00189 }
00190
00191