Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

fretboard.cpp

Go to the documentation of this file.
00001 #include "fretboard.h"
00002 
00003 /* OPIE */
00004 #include <opie2/odebug.h>
00005 using namespace Opie::Core;
00006 
00007 /* QT */
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     //odebug << "inst " << instid << "  is " << inst.instName().data() << "" << oendl; 
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     //debug
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     //draw frets
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     //draw strings
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                 //no more than six octaves can be visualised (there is a zero octave)
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 //****************************************************************************

Generated on Sat Nov 5 16:17:35 2005 for OPIE by  doxygen 1.4.2