summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/tonleiter/config.in4
-rw-r--r--noncore/multimedia/tonleiter/fretboard.cpp159
-rw-r--r--noncore/multimedia/tonleiter/fretboard.h54
-rw-r--r--noncore/multimedia/tonleiter/main.cpp19
-rw-r--r--noncore/multimedia/tonleiter/mainwidget.cpp28
-rw-r--r--noncore/multimedia/tonleiter/mainwidget.h22
-rw-r--r--noncore/multimedia/tonleiter/menuwidget.cpp72
-rw-r--r--noncore/multimedia/tonleiter/menuwidget.h30
-rw-r--r--noncore/multimedia/tonleiter/tonleiter.control9
-rw-r--r--noncore/multimedia/tonleiter/tonleiter.cpp0
-rw-r--r--noncore/multimedia/tonleiter/tonleiter.pro13
-rw-r--r--noncore/multimedia/tonleiter/tonleiterdata.cpp151
-rw-r--r--noncore/multimedia/tonleiter/tonleiterdata.h46
-rw-r--r--noncore/multimedia/tonleiter/tonleiterdatahelper.cpp133
-rw-r--r--noncore/multimedia/tonleiter/tonleiterdatahelper.h53
-rw-r--r--pics/tonleiter.pngbin0 -> 416 bytes
16 files changed, 793 insertions, 0 deletions
diff --git a/noncore/multimedia/tonleiter/config.in b/noncore/multimedia/tonleiter/config.in
new file mode 100644
index 0000000..d580ad7
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/config.in
@@ -0,0 +1,4 @@
1 config TONLEITER
2 boolean "tonleiter (shows scales on sting instruments)"
3 default "n"
4 depends ( LIBQPE || LIBQPE-X11 )
diff --git a/noncore/multimedia/tonleiter/fretboard.cpp b/noncore/multimedia/tonleiter/fretboard.cpp
new file mode 100644
index 0000000..d8e48d3
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/fretboard.cpp
@@ -0,0 +1,159 @@
1#include "fretboard.h"
2
3#include <qpainter.h>
4
5FretBoard::FretBoard(TonleiterData* data,QWidget* parent,const char* name,WFlags f)
6:QWidget(parent,name,f),data(data)
7{
8 setBackgroundColor(QColor(0,0,0));
9 fretpen=QPen(QColor(155,155,155),0);
10 markerbrush=QBrush(QColor(155,155,155));
11 stringpen=QPen(QColor(255,255,255),3);
12 connect(data,SIGNAL(dataChange()),this,SLOT(dataChange()));
13}
14//****************************************************************************
15FretBoard::~FretBoard()
16{
17}
18//****************************************************************************
19void FretBoard::dataChange()
20{
21 repaint(true);
22}
23//****************************************************************************
24void FretBoard::paintEvent(QPaintEvent* pe)
25{
26 Q_UNUSED(pe);
27
28 int instid=data->getCurrentInstrumentID();
29 inst=data->getInstrument(instid);
30 //qDebug("inst %d is %s",instid,inst.instName().data());
31
32 QRect mysize=rect();
33
34 xmargin=(int)(mysize.width()*0.05);
35 xmin=2*xmargin;
36 xmax=mysize.width()-xmargin;
37 xwidth=xmax-xmin;
38
39 ymargin=(int)(mysize.height()*0.1);
40 ymin=ymargin;
41 ymax=mysize.height()-2*ymargin;
42 yheight=ymax-ymin;
43
44 QPainter p(this);
45 paintBoard(&p);
46 paintFrets(&p);
47 paintStrings(&p);
48 paintScale(&p);
49}
50//****************************************************************************
51void FretBoard::resizeEvent(QResizeEvent* re)
52{
53 Q_UNUSED(re);
54}
55//****************************************************************************
56void FretBoard::paintBoard(QPainter* p)
57{
58 //debug
59 QColor bgc=QColor(142,138,120);
60 p->setPen(QPen(bgc,5));
61 p->setBrush(QBrush(bgc));
62 p->drawRect(xmin,ymin,xwidth,yheight);
63
64}
65//****************************************************************************
66void FretBoard::paintFrets(QPainter* p)
67{
68 //draw frets
69 p->setPen(fretpen);
70 p->setBrush(markerbrush);
71 fretdist=(double)(xwidth)/(double)(inst.noOfFrets());
72
73 int markerwidth = (int)(fretdist/4.0);
74 if(markerwidth>5)
75 markerwidth=5;
76 else if(markerwidth<2)
77 markerwidth=2;
78
79 for(int f=0;f<=inst.noOfFrets();f++)
80 {
81 int fretpos=(int)(fretdist*f);
82 p->drawLine(fretpos+xmin,ymin,fretpos+xmin,ymax);
83
84 int above_octave=f%12;
85 int octave=(f-above_octave)/12;
86 int marker=f-12*octave;
87
88
89 if(marker==5 || marker==7 || marker==9)
90 {
91 p->drawEllipse(fretpos+xmin,ymax+ymargin,markerwidth,markerwidth);
92 }
93 else if(marker==0 && f!=0)
94 {
95 p->drawEllipse(fretpos+xmin,ymax+ymargin+2*markerwidth,markerwidth,markerwidth);
96 p->drawEllipse(fretpos+xmin,ymax+ymargin-2*markerwidth,markerwidth,markerwidth);
97 }
98
99 }
100}
101//****************************************************************************
102void FretBoard::paintStrings(QPainter* p)
103{
104 //draw strings
105 p->setPen(stringpen);
106
107 stringdist=(double)(yheight)/(double)(inst.noOfStrings()-1);
108 for(int s=0;s<inst.noOfStrings();s++)
109 {
110 int stringpos=(int)(stringdist*s);
111 p->drawLine(xmin,stringpos+ymin,xmax,stringpos+ymin);
112
113 int stinglabelid=inst.noOfStrings()-(s+1);
114 QString label=Note::getNameOfNote(inst.string(stinglabelid));
115 p->drawText(xmargin/2,stringpos+ymin,label);
116 }
117}
118//****************************************************************************
119void FretBoard::paintScale(QPainter* p)
120{
121 int dotsize=10;
122 int scaleid=data->getCurrentScaleID();
123 Scale scale=data->getScale(scaleid);
124
125 int colorstart=255%inst.noOfOctaves();
126 int colorintervall=(255-colorstart)/inst.noOfOctaves();
127
128 for(int s=0;s<inst.noOfStrings();s++)
129 {
130 int y=(int)(stringdist*s)+ymin;
131 int stingid=inst.noOfStrings()-(s+1);
132 for(int f=0;f<=inst.noOfFrets();f++)
133 {
134 int note=inst.string(stingid)+f;
135 if(scale.noteInScale(data->getCurrentBaseNote(),note))
136 {
137 int x=(int)(fretdist*f)+xmin;
138
139 int octave=Note::octaveOfBaseNote(data->getCurrentBaseNote(),note);
140 if(octave>5) octave=5;
141 p->setPen(QColor(255,0,0));
142 int c=colorstart+octave*colorintervall;
143 QColor dotcolor(c,c,255);
144 p->setBrush(dotcolor);
145
146 p->drawEllipse(x-dotsize/2,y-dotsize/2,dotsize,dotsize);
147
148 if(data->isDrawNames())
149 {
150 p->setPen(QColor(0,255,0));
151 p->drawText(x-dotsize/2,y-dotsize/2,Note::getNameOfNote(note));
152 }
153
154 }
155 }
156 }
157}
158//****************************************************************************
159//****************************************************************************
diff --git a/noncore/multimedia/tonleiter/fretboard.h b/noncore/multimedia/tonleiter/fretboard.h
new file mode 100644
index 0000000..eb509b0
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/fretboard.h
@@ -0,0 +1,54 @@
1#ifndef TONLEITER_FRET_BOARD_H
2#define TONLEITER_FRET_BOARD_H
3
4#include <qbrush.h>
5#include <qpen.h>
6#include <qvaluelist.h>
7#include <qwidget.h>
8
9
10#include "tonleiterdata.h"
11
12class FretBoard : public QWidget
13{
14 Q_OBJECT
15private:
16 TonleiterData* data;
17
18 QPen fretpen;
19 QBrush markerbrush;
20 QPen stringpen;
21
22 Instrument inst;
23
24 int xmargin;
25 int xmin;
26 int xmax;
27 int xwidth;
28
29 int ymargin;
30 int ymin;
31 int ymax;
32 int yheight;
33
34 double fretdist;
35 double stringdist;
36
37public:
38 FretBoard(TonleiterData* data,QWidget* parent,const char* name="FretBoard",WFlags f=0);
39 virtual ~FretBoard();
40private slots:
41 void dataChange();
42private:
43 void paintEvent(QPaintEvent* pe);
44 void resizeEvent(QResizeEvent* re);
45 //void mousePressEvent(QMouseEvent* mpe);
46 //void mouseMoveEvent(QMouseEvent* mme);
47 //void mouseReleaseEvent(QMouseEvent* mre);
48 void paintBoard(QPainter* p);
49 void paintFrets(QPainter* p);
50 void paintStrings(QPainter* p);
51 void paintScale(QPainter* p);
52};
53
54#endif //TONLEITER_FRET_BOARD_H
diff --git a/noncore/multimedia/tonleiter/main.cpp b/noncore/multimedia/tonleiter/main.cpp
new file mode 100644
index 0000000..0eaa162
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/main.cpp
@@ -0,0 +1,19 @@
1/***************************************************************************
2 * This program is free software; you can redistribute it and/or modify *
3 * it under the terms of the GNU General Public License as published by *
4 * the Free Software Foundation; either version 2 of the License, or *
5 * (at your option) any later version. *
6 ***************************************************************************/
7
8#include "mainwidget.h"
9#include <qpe/qpeapplication.h>
10
11int main(int argc, char* argv[])
12{
13 QPEApplication a(argc, argv);
14 MainWidget mw;
15 a.showMainWidget( &mw);
16 return a.exec();
17}
18
19
diff --git a/noncore/multimedia/tonleiter/mainwidget.cpp b/noncore/multimedia/tonleiter/mainwidget.cpp
new file mode 100644
index 0000000..0a20b9e
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/mainwidget.cpp
@@ -0,0 +1,28 @@
1#include "mainwidget.h"
2
3#include <qwidget.h>
4#include <qlayout.h>
5
6MainWidget::MainWidget(QWidget* parent,const char* name,WFlags f)
7:QMainWindow(parent,name,f)
8{
9 setCaption("Tonleiter");
10 data=new TonleiterData(this);
11
12 QWidget* mainwidget=new QWidget(this,"mainwidget");
13 setCentralWidget(mainwidget);
14 QBoxLayout* mainlayout=new QBoxLayout(mainwidget,QBoxLayout::TopToBottom);
15
16 menuwidget=new MenuWidget(data,mainwidget);
17 mainlayout->addWidget(menuwidget);
18
19 fretboard=new FretBoard(data,mainwidget);
20 mainlayout->addWidget(fretboard);
21
22}
23//****************************************************************************
24MainWidget::~MainWidget()
25{
26}
27//****************************************************************************
28//****************************************************************************
diff --git a/noncore/multimedia/tonleiter/mainwidget.h b/noncore/multimedia/tonleiter/mainwidget.h
new file mode 100644
index 0000000..71b5ba9
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/mainwidget.h
@@ -0,0 +1,22 @@
1#ifndef TONLEITER_MAINWIDGET_H
2#define TONLEITER_MAINWIDGET_H
3
4#include <qmainwindow.h>
5
6#include "fretboard.h"
7#include "menuwidget.h"
8#include "tonleiterdata.h"
9
10class MainWidget : public QMainWindow
11{
12 Q_OBJECT
13private:
14 TonleiterData* data;
15 MenuWidget* menuwidget;
16 FretBoard* fretboard;
17public:
18 MainWidget(QWidget* parent=0,const char* name="MainWidget",WFlags f=0);
19 virtual ~MainWidget();
20};
21
22#endif //TONLEITER_MAINWIDGET_H
diff --git a/noncore/multimedia/tonleiter/menuwidget.cpp b/noncore/multimedia/tonleiter/menuwidget.cpp
new file mode 100644
index 0000000..9cc2c6b
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/menuwidget.cpp
@@ -0,0 +1,72 @@
1#include "menuwidget.h"
2
3#include <qlabel.h>
4#include <qlayout.h>
5
6MenuWidget::MenuWidget(TonleiterData* data,QWidget* parent,const char* name,WFlags f)
7:QWidget(parent,name,f),data(data)
8{
9 QGridLayout* layout=new QGridLayout(this,3,3,10,-1,"menulayout");
10
11 QLabel* instLabel=new QLabel(tr("Instrument"),this,"instLabel");
12 layout->addWidget(instLabel,0,0);
13 boxInst=new QComboBox(this,"boxInst");
14 connect(boxInst,SIGNAL(activated(int)),data,SLOT(setCurrentInstrumetID(int)));
15 layout->addWidget(boxInst,0,1);
16 editInst=new QPushButton(tr("Edit"),this,"editInst");
17 layout->addWidget(editInst,0,2);
18
19 QLabel* noteLabel=new QLabel(tr("Note"),this,"noteLabel");
20 layout->addWidget(noteLabel,1,0);
21 boxNote=new QComboBox(this,"boxNote");
22 connect(boxNote,SIGNAL(activated(int)),data,SLOT(setCurrentNote(int)));
23 layout->addWidget(boxNote,1,1);
24 for(int a=0;a<12;a++)
25 boxNote->insertItem(Note::notenames[a],a);
26 boxNote->setCurrentItem(data->getCurrentBaseNote());
27 noteCheck=new QCheckBox(tr("show notes"),this,"noteCheck");
28 noteCheck->setChecked(data->isDrawNames());
29 connect(noteCheck,SIGNAL(toggled(bool)),data,SLOT(setDrawNames(bool)));
30 layout->addWidget(noteCheck,1,2);
31
32 QLabel* scaleLabel=new QLabel(tr("Scale"),this,"scaleLabel");
33 layout->addWidget(scaleLabel,2,0);
34 boxScale=new QComboBox(this,"boxScale");
35 connect(boxScale,SIGNAL(activated(int)),data,SLOT(setCurrentScaleID(int)));
36 layout->addWidget(boxScale,2,1);
37 editScale=new QPushButton(tr("Edit"),this,"editScale");
38 layout->addWidget(editScale,2,2);
39
40 updateBoxes();
41
42}
43//****************************************************************************
44MenuWidget::~MenuWidget()
45{
46}
47//****************************************************************************
48void MenuWidget::updateBoxes()
49{
50 boxInst->clear();
51
52 for(int i=0;i<data->noOfInstruments();i++)
53 {
54 Instrument inst=data->getInstrument(i);
55 QString name=inst.instName();
56 if(name.isNull()) continue;
57 boxInst->insertItem(name,i);
58 }
59 boxInst->setCurrentItem(data->getCurrentInstrumentID());
60
61 boxScale->clear();
62 for(int s=0;s<data->noOfScales();s++)
63 {
64 Scale scale=data->getScale(s);
65 QString name=scale.scaleName();
66 if(name.isNull()) continue;
67 boxScale->insertItem(name,s);
68 }
69 boxScale->setCurrentItem(data->getCurrentScaleID());
70}
71//****************************************************************************
72//****************************************************************************
diff --git a/noncore/multimedia/tonleiter/menuwidget.h b/noncore/multimedia/tonleiter/menuwidget.h
new file mode 100644
index 0000000..2635f8a
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/menuwidget.h
@@ -0,0 +1,30 @@
1#ifndef TONLEITER_MENU_WIDGET_H
2#define TONLEITER_MENU_WIDGET_H
3
4#include <qcheckbox.h>
5#include <qcombobox.h>
6#include <qpushbutton.h>
7#include <qwidget.h>
8#include <qlabel.h>
9
10#include "tonleiterdata.h"
11
12class MenuWidget : public QWidget
13{
14 Q_OBJECT
15private:
16 TonleiterData* data;
17 QComboBox* boxInst;
18 QPushButton* editInst;
19 QComboBox* boxNote;
20 QCheckBox* noteCheck;
21 QComboBox* boxScale;
22 QPushButton* editScale;
23public:
24 MenuWidget(TonleiterData* data,QWidget* parent,const char* name="MenuWidget",WFlags f=0);
25 ~MenuWidget();
26public slots:
27 void updateBoxes();
28};
29
30#endif //TONLEITER_MENU_WIDGET_H
diff --git a/noncore/multimedia/tonleiter/tonleiter.control b/noncore/multimedia/tonleiter/tonleiter.control
new file mode 100644
index 0000000..e8a36e8
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/tonleiter.control
@@ -0,0 +1,9 @@
1Package: tonleiter
2Files: bin/tonlieter pics/tonleiter apps/Applications/tonleiter.desktop
3Priority: optional
4Section: multimedia/applications
5Maintainer: Ralf Waspe <rwaspe@web.de>
6Architecture: arm
7Depends: task-opie-minimal
8Description: music scales for sting instruments
9Version: $QPE_VERSION$EXTRAVERSION
diff --git a/noncore/multimedia/tonleiter/tonleiter.cpp b/noncore/multimedia/tonleiter/tonleiter.cpp
new file mode 100644
index 0000000..e69de29
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/tonleiter.cpp
diff --git a/noncore/multimedia/tonleiter/tonleiter.pro b/noncore/multimedia/tonleiter/tonleiter.pro
new file mode 100644
index 0000000..bf19c3a
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/tonleiter.pro
@@ -0,0 +1,13 @@
1TEMPLATE = app
2#CONFIG = qt warn_on debug
3CONFIG = qt warn_on release
4HEADERS = mainwidget.h tonleiterdata.h tonleiterdatahelper.h fretboard.h menuwidget.h
5SOURCES = mainwidget.cpp tonleiterdata.cpp tonleiterdatahelper.cpp fretboard.cpp menuwidget.cpp main.cpp
6INCLUDEPATH += $(OPIEDIR)/include
7DEPENDPATH += $(OPIEDIR)/include
8LIBS += -lqpe
9INTERFACES =
10TARGET = tonleiter
11DESTDIR = $(OPIEDIR)/bin
12#TMAKE_CXXFLAGS += -DQT_QWS_VERCEL_IDR -DQWS -fno-exceptions -fno-rtti
13include ( $(OPIEDIR)/include.pro )
diff --git a/noncore/multimedia/tonleiter/tonleiterdata.cpp b/noncore/multimedia/tonleiter/tonleiterdata.cpp
new file mode 100644
index 0000000..8a9fdca
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/tonleiterdata.cpp
@@ -0,0 +1,151 @@
1#include "tonleiterdata.h"
2
3TonleiterData::TonleiterData(QObject* parent)
4:QObject(parent)
5{
6 drawnames=true;
7 loadData();
8}
9//****************************************************************************
10TonleiterData::~TonleiterData()
11{
12 saveData();
13}
14//****************************************************************************
15void TonleiterData::setCurrentInstrumetID(int id)
16{
17 if(id>=0 && id<noOfInstruments())
18 {
19 currentInstrumentID=id;
20 emit dataChange();
21 }
22}
23//****************************************************************************
24void TonleiterData::setCurrentScaleID(int id)
25{
26 if(id>=0 && id<noOfScales())
27 {
28 currentScaleID=id;
29 emit dataChange();
30 }
31}
32//****************************************************************************
33void TonleiterData::setCurrentNote(int id)
34{
35 if(id>=0 && id<12)
36 {
37 currentNote=id;
38 emit dataChange();
39 }
40}
41//****************************************************************************
42void TonleiterData::setDrawNames(bool dn)
43{
44 drawnames=dn;
45 emit dataChange();
46}
47//****************************************************************************
48void TonleiterData::loadData()
49{
50 QValueList<int> strings1;
51 strings1.append(Note::getNoteFromName("B",0));
52 strings1.append(Note::getNoteFromName("E",1));
53 strings1.append(Note::getNoteFromName("A",1));
54 strings1.append(Note::getNoteFromName("D",2));
55 strings1.append(Note::getNoteFromName("G",2));
56 strings1.append(Note::getNoteFromName("C",3));
57 instruments.append(Instrument("Thumb6",26,strings1));
58
59 QValueList<int> strings2;
60 strings2.append(Note::getNoteFromName("E",1));
61 strings2.append(Note::getNoteFromName("A",1));
62 strings2.append(Note::getNoteFromName("D",2));
63 strings2.append(Note::getNoteFromName("G",2));
64 instruments.append(Instrument("Bass 4",12,strings2));
65
66 currentInstrumentID=1;
67
68 QValueList<int> scale1;
69 scale1.append(0);
70 scale1.append(2);
71 scale1.append(3);
72 scale1.append(5);
73 scale1.append(7);
74 scale1.append(8);
75 scale1.append(10);
76 scales.append(Scale("Minor",scale1));
77
78 QValueList<int> scale2;
79 scale2.append(0);
80 scale2.append(2);
81 scale2.append(4);
82 scale2.append(5);
83 scale2.append(7);
84 scale2.append(9);
85 scale2.append(10);
86 scales.append(Scale("Major",scale2));
87
88 currentScaleID=0;
89
90 currentNote=Note::getNoteFromName("A",0);
91}
92//****************************************************************************
93void TonleiterData::saveData()
94{
95}
96//****************************************************************************
97int TonleiterData::noOfInstruments()
98{
99 return (int)instruments.count();
100}
101//****************************************************************************
102Instrument TonleiterData::getInstrument(int id)
103{
104 if(id>=0 && id<noOfInstruments())
105 return instruments[id];
106 else
107 {
108 qDebug("undefined insrtument %d of %d",id,instruments.count());
109 return Instrument();
110 }
111
112}
113//****************************************************************************
114int TonleiterData::getCurrentInstrumentID()
115{
116 return currentInstrumentID;
117}
118//****************************************************************************
119int TonleiterData::noOfScales()
120{
121 return (int)scales.count();
122}
123//****************************************************************************
124Scale TonleiterData::getScale(int id)
125{
126 if(id>=0 && id<noOfScales())
127 return scales[id];
128 else
129 {
130 qDebug("Undefined scale");
131 return Scale();
132 }
133}
134//****************************************************************************
135int TonleiterData::getCurrentScaleID()
136{
137 return currentScaleID;
138}
139//****************************************************************************
140int TonleiterData::getCurrentBaseNote()
141{
142 return currentNote;
143}
144//****************************************************************************
145bool TonleiterData::isDrawNames()
146{
147 return drawnames;
148}
149//****************************************************************************
150//****************************************************************************
151
diff --git a/noncore/multimedia/tonleiter/tonleiterdata.h b/noncore/multimedia/tonleiter/tonleiterdata.h
new file mode 100644
index 0000000..a5e6884
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/tonleiterdata.h
@@ -0,0 +1,46 @@
1#ifndef TONLEITER_DATA_H
2#define TONLEITER_DATA_H
3
4#include <qobject.h>
5
6#include "tonleiterdatahelper.h"
7
8class TonleiterData : public QObject
9{
10 Q_OBJECT
11private:
12 QValueList<Instrument> instruments;
13 int currentInstrumentID;
14
15 QValueList<Scale> scales;
16 int currentScaleID;
17
18 int currentNote;
19 bool drawnames;
20public:
21 TonleiterData(QObject* parent);
22 ~TonleiterData();
23signals:
24 void dataChange();
25public slots:
26 void setCurrentInstrumetID(int id);
27 void setCurrentScaleID(int id);
28 void setCurrentNote(int id);
29 void setDrawNames(bool dn);
30private:
31 void loadData();
32 void saveData();
33public:
34 int noOfInstruments();
35 Instrument getInstrument(int id);
36 int getCurrentInstrumentID();
37
38 int noOfScales();
39 Scale getScale(int id);
40 int getCurrentScaleID();
41
42 int getCurrentBaseNote();
43 bool isDrawNames();
44};
45
46#endif //TONLEITER_DATA_H
diff --git a/noncore/multimedia/tonleiter/tonleiterdatahelper.cpp b/noncore/multimedia/tonleiter/tonleiterdatahelper.cpp
new file mode 100644
index 0000000..6b8a5bd
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/tonleiterdatahelper.cpp
@@ -0,0 +1,133 @@
1#include "tonleiterdatahelper.h"
2
3int Note::getOctaveOfNote(int note)
4{
5 int remain=note%12;
6 return (note-remain)/12;
7}
8//****************************************************************************
9QString Note::getNameOfNote(int note)
10{
11 int octave=getOctaveOfNote(note);
12 return notenames[note-12*octave];
13}
14//****************************************************************************
15int Note::getNoteFromName(QString name,int octave)
16{
17 int notevalue=0;
18 for(int a=0;a<12;a++)
19 {
20 if(name==notenames[a])
21 {
22 notevalue=a;
23 break;
24 }
25 }
26 return notevalue+12*octave;
27}
28//****************************************************************************
29int Note::octaveOfBaseNote(int base,int note)
30{
31 int normnote = (note>=base) ? note-base : (12-base)+note;
32 int octave=getOctaveOfNote(normnote);
33 //qDebug("note %d of %d base is norm %d -> ocatve %d",note,base,normnote,octave);
34 return octave;
35}
36//****************************************************************************
37//****************************************************************************
38Instrument::Instrument()
39{
40 name="UNDEFINED";
41 frets=0;
42}
43//****************************************************************************
44Instrument::Instrument(QString name,int frets,QValueList<int> strings)
45:name(name),frets(frets),strings(strings)
46{
47}
48//****************************************************************************
49Instrument::~Instrument()
50{
51}
52//****************************************************************************
53int Instrument::noOfStrings()
54{
55 return (int)strings.count();
56}
57//****************************************************************************
58int Instrument::noOfFrets()
59{
60 return frets;
61}
62//****************************************************************************
63QString Instrument::instName()
64{
65 return name;
66}
67//****************************************************************************
68int Instrument::string(int id)
69{
70 return strings[id];
71}
72//****************************************************************************
73int Instrument::noOfOctaves()
74{
75 int lowest=strings[0];
76 int highest=strings[strings.count()-1]+frets;
77 return (int)((highest-lowest)/12.0);
78}
79//****************************************************************************
80//****************************************************************************
81Scale::Scale()
82{
83 name="UNDEFINED";
84}
85//****************************************************************************
86Scale::Scale(QString name,QValueList<int> halftones)
87:name(name),halftones(halftones)
88{
89}
90//****************************************************************************
91Scale::~Scale()
92{
93}
94//****************************************************************************
95int Scale::noOfHaltones()
96{
97 return (int)halftones.count();
98}
99//****************************************************************************
100int Scale::getHalfTone(int id)
101{
102 if(id>=0 && noOfHaltones()<id)
103 {
104 return halftones[id];
105 }
106 else
107 return 0;
108}
109//****************************************************************************
110QString Scale::scaleName()
111{
112 return name;
113}
114//****************************************************************************
115bool Scale::noteInScale(int base,int note)
116{
117 int octave=Note::getOctaveOfNote(note);
118 note-=12*octave;
119 int normnote = (note>=base) ? note-base : (12-base)+note;
120
121 if(halftones.contains(normnote)>0)
122 {
123 //qDebug("OK : base : %d, note %d -> norm %d",base,note,normnote);
124 return true;
125 }
126 else
127 {
128 //qDebug("BAD : base : %d, note %d -> norm %d",base,note,normnote);
129 return false;
130 }
131}
132//****************************************************************************
133//****************************************************************************
diff --git a/noncore/multimedia/tonleiter/tonleiterdatahelper.h b/noncore/multimedia/tonleiter/tonleiterdatahelper.h
new file mode 100644
index 0000000..94895ea
--- a/dev/null
+++ b/noncore/multimedia/tonleiter/tonleiterdatahelper.h
@@ -0,0 +1,53 @@
1#ifndef TONLEITER_DATA_HELPER_H
2#define TONLEITER_DATA_HELPER_H
3
4#include <qstring.h>
5#include <qvaluelist.h>
6
7namespace Note
8{
9 const QString notenames[]={"C","C#","D","D#","E","F","F#","G","G#","A","A#","B"};
10
11 int getOctaveOfNote(int note);
12 QString getNameOfNote(int note);
13 int getNoteFromName(QString name,int octave);
14 int octaveOfBaseNote(int base,int note);
15};
16
17class Instrument
18{
19private:
20 QString name;
21 int frets;
22 QValueList<int> strings;
23public:
24 Instrument();
25 Instrument(QString name,int frets,QValueList<int> strings);
26 ~Instrument();
27public:
28 int noOfStrings();
29 int noOfFrets();
30 QString instName();
31 int string(int id);
32 int noOfOctaves();
33};
34
35class Scale
36{
37private:
38 QValueList<int> halftones;
39 QString name;
40public:
41 Scale();
42 Scale(QString name,QValueList<int> halftones);
43 ~Scale();
44public:
45 int noOfHaltones();
46 int getHalfTone(int id);
47 QString scaleName();
48 bool noteInScale(int base,int note);
49};
50
51
52#endif //TONLEITER_DATA_HELPER_H
53
diff --git a/pics/tonleiter.png b/pics/tonleiter.png
new file mode 100644
index 0000000..ce78597
--- a/dev/null
+++ b/pics/tonleiter.png
Binary files differ