summaryrefslogtreecommitdiff
authormickeyl <mickeyl>2004-01-20 15:51:03 (UTC)
committer mickeyl <mickeyl>2004-01-20 15:51:03 (UTC)
commit996826e77a8f96ada424814716178e65caba9287 (patch) (unidiff)
tree09c60dcc4437dba1838c086b7eeb5480800716d5
parent557eb6a25f2cfc6e350c1731ead4df0e07861f25 (diff)
downloadopie-996826e77a8f96ada424814716178e65caba9287.zip
opie-996826e77a8f96ada424814716178e65caba9287.tar.gz
opie-996826e77a8f96ada424814716178e65caba9287.tar.bz2
package the guitar sample
fix reading from share/powerchord/
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/powerchord/gs.cpp17
-rw-r--r--noncore/multimedia/powerchord/gs.h1
-rw-r--r--noncore/multimedia/powerchord/opie-powerchord.control8
-rw-r--r--share/powerchord/acguitar.rawbin0 -> 50000 bytes
4 files changed, 15 insertions, 11 deletions
diff --git a/noncore/multimedia/powerchord/gs.cpp b/noncore/multimedia/powerchord/gs.cpp
index a3e85c9..fdcfb74 100644
--- a/noncore/multimedia/powerchord/gs.cpp
+++ b/noncore/multimedia/powerchord/gs.cpp
@@ -1,224 +1,229 @@
1 1
2//#include <FL/Fl.H> 2//#include <FL/Fl.H>
3//#include <FL/Fl_Widget.H> 3//#include <FL/Fl_Widget.H>
4//#include <FL/fl_draw.H> 4//#include <FL/fl_draw.H>
5#include <stdio.h> 5#include <stdio.h>
6//#include <qpixmap.h> 6//#include <qpixmap.h>
7#include "gs.h" 7#include "gs.h"
8 8
9#include <sys/ioctl.h> 9#include <sys/ioctl.h>
10#include <unistd.h> 10#include <unistd.h>
11#include <fcntl.h> 11#include <fcntl.h>
12#include <sys/soundcard.h> 12#include <sys/soundcard.h>
13 13
14#include <errno.h> 14#include <errno.h>
15#include <string.h> 15#include <string.h>
16 16
17#include <stdlib.h> 17#include <stdlib.h>
18 18
19//#include <qpainter.h> 19//#include <qpainter.h>
20#include <qmessagebox.h> 20#include <qmessagebox.h>
21#include <qstring.h>
21 22
22 23
23gs::gs() 24gs::gs()
24{ 25{
25 26
26 finger[0] = OPEN; 27 finger[0] = OPEN;
27 finger[1] = OPEN; 28 finger[1] = OPEN;
28 finger[2] = OPEN; 29 finger[2] = OPEN;
29 finger[3] = OPEN; 30 finger[3] = OPEN;
30 finger[4] = OPEN; 31 finger[4] = OPEN;
31 finger[5] = OPEN; 32 finger[5] = OPEN;
32 33
33 tuning[0] = 0; 34 tuning[0] = 0;
34 tuning[1] = 0; 35 tuning[1] = 0;
35 tuning[2] = 0; 36 tuning[2] = 0;
36 tuning[3] = 0; 37 tuning[3] = 0;
37 tuning[4] = 0; 38 tuning[4] = 0;
38 tuning[5] = 0; 39 tuning[5] = 0;
39 40
40 initial_fret = 0; 41 initial_fret = 0;
41 42
42 audio_fd = -1; 43 audio_fd = -1;
43 44
44 pb_rate0 = 0; 45 pb_rate0 = 0;
45 pb_rate1 = 0; 46 pb_rate1 = 0;
46 pb_rate2 = 0; 47 pb_rate2 = 0;
47 pb_rate3 = 0; 48 pb_rate3 = 0;
48 pb_rate4 = 0; 49 pb_rate4 = 0;
49 pb_rate5 = 0; 50 pb_rate5 = 0;
50 pb_rate6 = 0; 51 pb_rate6 = 0;
51 52
52 pb_oct0 = 0; 53 pb_oct0 = 0;
53 pb_oct1 = 0; 54 pb_oct1 = 0;
54 pb_oct2 = 0; 55 pb_oct2 = 0;
55 pb_oct3 = 0; 56 pb_oct3 = 0;
56 pb_oct4 = 0; 57 pb_oct4 = 0;
57 pb_oct5 = 0; 58 pb_oct5 = 0;
58 pb_oct6 = 0; 59 pb_oct6 = 0;
59 60
60 // initialise reverb buffer 61 // initialise reverb buffer
61 reverb = (signed short *)malloc(1024 * sizeof(signed short)); 62 reverb = (signed short *)malloc(1024 * sizeof(signed short));
62 63
63 for (reverb_ptr=0;reverb_ptr<1024;reverb_ptr++){ 64 for (reverb_ptr=0;reverb_ptr<1024;reverb_ptr++){
64 reverb[reverb_ptr] = 0; 65 reverb[reverb_ptr] = 0;
65 } 66 }
66 reverb_ptr = 0; 67 reverb_ptr = 0;
67 reverb_max = 1024; 68 reverb_max = 1024;
68 69
69 // load sampled 'E' string 70 // load sampled 'E' string
70 int samplen = 25000; 71 int samplen = 25000;
71 72
72 signed short *dsp_buf = (signed short *)malloc(samplen * sizeof(signed short)); 73 signed short *dsp_buf = (signed short *)malloc(samplen * sizeof(signed short));
73 signed short *dsp_buf_ptr = dsp_buf; 74 signed short *dsp_buf_ptr = dsp_buf;
74 75
75 int raw_fd; 76 int raw_fd;
76 raw_fd = open(ACGUITAR_PATH_S, O_RDONLY); 77
77 78 QString path = getenv( "OPIEDIR" );
79 path.append( "/share/powerchord/acguitar.raw" );
80
81 raw_fd = open( (const char*) path, O_RDONLY);
82
78 if (raw_fd < 0){ 83 if (raw_fd < 0){
79 fprintf(stderr, "Failed to open raw file (%s)\n", strerror(errno)); 84 fprintf(stderr, "Failed to open raw file (%s)\n", strerror(errno));
80 exit(-1); 85 exit(-1);
81 } 86 }
82 87
83 int totread = 0; 88 int totread = 0;
84 int i; 89 int i;
85 90
86 while (totread < samplen*2){ 91 while (totread < samplen*2){
87 int want = samplen*2 - totread; 92 int want = samplen*2 - totread;
88 93
89 int numread = read(raw_fd, dsp_buf_ptr, want); 94 int numread = read(raw_fd, dsp_buf_ptr, want);
90 fprintf(stderr, "read %d bytes\n", numread); 95 fprintf(stderr, "read %d bytes\n", numread);
91 totread += numread; 96 totread += numread;
92 dsp_buf_ptr += numread/2; 97 dsp_buf_ptr += numread/2;
93 98
94 if (numread == 0){ 99 if (numread == 0){
95 fprintf(stderr, "failed to read bytes\n"); 100 fprintf(stderr, "failed to read bytes\n");
96 exit(-1); 101 exit(-1);
97 } 102 }
98 } 103 }
99 104
100 close(raw_fd); 105 close(raw_fd);
101 106
102 // scale down a bit for mixing 107 // scale down a bit for mixing
103 for (i=0;i<samplen;i++){ 108 for (i=0;i<samplen;i++){
104 dsp_buf[i] /= 6; 109 dsp_buf[i] /= 6;
105 } 110 }
106 111
107 set_tonebank(0, dsp_buf, samplen); 112 set_tonebank(0, dsp_buf, samplen);
108 set_tonebank(1, dsp_buf, samplen); 113 set_tonebank(1, dsp_buf, samplen);
109 set_tonebank(2, dsp_buf, samplen); 114 set_tonebank(2, dsp_buf, samplen);
110 set_tonebank(3, dsp_buf, samplen); 115 set_tonebank(3, dsp_buf, samplen);
111 set_tonebank(4, dsp_buf, samplen); 116 set_tonebank(4, dsp_buf, samplen);
112 set_tonebank(5, dsp_buf, samplen); 117 set_tonebank(5, dsp_buf, samplen);
113 set_tonebank(6, dsp_buf, samplen); 118 set_tonebank(6, dsp_buf, samplen);
114 119
115} 120}
116 121
117void gs::set_tonebank(int tb, signed short *buf, int length) 122void gs::set_tonebank(int tb, signed short *buf, int length)
118{ 123{
119 switch(tb){ 124 switch(tb){
120 case 0: 125 case 0:
121 tonebank0 = buf; 126 tonebank0 = buf;
122 tonebank_length0 = length; 127 tonebank_length0 = length;
123 break; 128 break;
124 case 1: 129 case 1:
125 tonebank1 = buf; 130 tonebank1 = buf;
126 tonebank_length1 = length; 131 tonebank_length1 = length;
127 break; 132 break;
128 case 2: 133 case 2:
129 tonebank2 = buf; 134 tonebank2 = buf;
130 tonebank_length2 = length; 135 tonebank_length2 = length;
131 break; 136 break;
132 case 3: 137 case 3:
133 tonebank3 = buf; 138 tonebank3 = buf;
134 tonebank_length3 = length; 139 tonebank_length3 = length;
135 break; 140 break;
136 case 4: 141 case 4:
137 tonebank4 = buf; 142 tonebank4 = buf;
138 tonebank_length4 = length; 143 tonebank_length4 = length;
139 break; 144 break;
140 case 5: 145 case 5:
141 tonebank5 = buf; 146 tonebank5 = buf;
142 tonebank_length5 = length; 147 tonebank_length5 = length;
143 break; 148 break;
144 case 6: 149 case 6:
145 tonebank6 = buf; 150 tonebank6 = buf;
146 tonebank_length6 = length; 151 tonebank_length6 = length;
147 break; 152 break;
148 153
149 } 154 }
150} 155}
151 156
152 157
153void gs::Finger(int f, int position){ 158void gs::Finger(int f, int position){
154 if (f < 0 || f > 5){ 159 if (f < 0 || f > 5){
155 fprintf(stderr, "Error - finger2 value was %d\n", f); 160 fprintf(stderr, "Error - finger2 value was %d\n", f);
156 return; 161 return;
157 } 162 }
158 163
159 finger[f] = position; 164 finger[f] = position;
160} 165}
161 166
162void gs::Tuning(int t[6]){ 167void gs::Tuning(int t[6]){
163 for (int i=0;i<6;i++){ 168 for (int i=0;i<6;i++){
164 tuning[i] = t[i]; 169 tuning[i] = t[i];
165 } 170 }
166} 171}
167 172
168// length in ps (seconds x 10^-9) of the period of a note. 173// length in ps (seconds x 10^-9) of the period of a note.
169// we use these as ratios in a breshenham-like algorithm to 174// we use these as ratios in a breshenham-like algorithm to
170// scale a deep note to a higher pitch 175// scale a deep note to a higher pitch
171// They are derived from f(A) = 440Hz and multiply each successive 176// They are derived from f(A) = 440Hz and multiply each successive
172// semitone by the 12th root of 2 (such that after 12 multiplications for 177// semitone by the 12th root of 2 (such that after 12 multiplications for
173// 12 semitones you have a note exactly 2x the frequency of the initial one, 178// 12 semitones you have a note exactly 2x the frequency of the initial one,
174// - an octave higher in other words.) 179// - an octave higher in other words.)
175 180
176int gs::note_periods[12] = { 181int gs::note_periods[12] = {
17790703, 18290703,
17885612, 18385612,
17980802, 18480802,
18076272, 18576272,
18171991, 18671991,
18267950, 18767950,
18364137, 18864137,
18460537, 18960537,
18557139, 19057139,
18653932, 19153932,
18750905, 19250905,
18848048 19348048
189}; 194};
190 195
191int gs::octave_step[6] = { 196int gs::octave_step[6] = {
192 1, 197 1,
193 2, 198 2,
194 4, 199 4,
195 8, 200 8,
196 16, 201 16,
197 32 202 32
198}; 203};
199 204
200int gs::Play(){ 205int gs::Play(){
201 int format; 206 int format;
202 int channels; 207 int channels;
203 int speed; 208 int speed;
204 209
205 frames = 0; 210 frames = 0;
206 211
207 if (audio_fd == -1){ 212 if (audio_fd == -1){
208 if ( (audio_fd = open("/dev/dsp", O_WRONLY, 0) ) == -1){ 213 if ( (audio_fd = open("/dev/dsp", O_WRONLY, 0) ) == -1){
209 audio_fd = -1; 214 audio_fd = -1;
210 return 1; 215 return 1;
211 } 216 }
212 217
213 format = AFMT_S16_NE; 218 format = AFMT_S16_NE;
214 219
215 if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1){ 220 if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1){
216 fprintf(stderr, "Error SNDCTL DSP SETFMT, %s\n", strerror(errno)); 221 fprintf(stderr, "Error SNDCTL DSP SETFMT, %s\n", strerror(errno));
217 exit(0); 222 exit(0);
218 } 223 }
219 224
220 channels = 1; 225 channels = 1;
221 226
222 if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1){ 227 if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1){
223 fprintf(stderr, "Error SNDCTL DSP CHANNELS, %s\n", strerror(errno)); 228 fprintf(stderr, "Error SNDCTL DSP CHANNELS, %s\n", strerror(errno));
224 exit(0); 229 exit(0);
diff --git a/noncore/multimedia/powerchord/gs.h b/noncore/multimedia/powerchord/gs.h
index 3e4c04d..f2b309f 100644
--- a/noncore/multimedia/powerchord/gs.h
+++ b/noncore/multimedia/powerchord/gs.h
@@ -1,124 +1,123 @@
1 1
2#ifndef __GS_H 2#ifndef __GS_H
3#define __GS_H 3#define __GS_H
4 4
5#include <qobject.h> 5#include <qobject.h>
6// sound includes 6// sound includes
7#include <sys/soundcard.h> 7#include <sys/soundcard.h>
8 8
9#define BUFSIZE 256 9#define BUFSIZE 256
10#define NUMCHANS 7 10#define NUMCHANS 7
11#define ACGUITAR_PATH_S "/usr/local/projects/opie-head/noncore/multimedia/powerchord/acguitar.raw"
12 11
13class gs : public QObject { 12class gs : public QObject {
14 13
15 Q_OBJECT 14 Q_OBJECT
16 15
17 public: 16 public:
18 gs(); 17 gs();
19 ~gs(); 18 ~gs();
20 19
21 private: 20 private:
22 21
23 int initial_fret; 22 int initial_fret;
24 int finger[6]; 23 int finger[6];
25 int tuning[6]; 24 int tuning[6];
26 25
27 signed short *reverb; 26 signed short *reverb;
28 int reverb_ptr; 27 int reverb_ptr;
29 int reverb_max; 28 int reverb_max;
30 29
31 int audio_fd; 30 int audio_fd;
32 signed short audio_buf[BUFSIZE]; 31 signed short audio_buf[BUFSIZE];
33 static int note_periods[12]; 32 static int note_periods[12];
34 static int octave_step[6]; 33 static int octave_step[6];
35 int frames; 34 int frames;
36 35
37 36
38 // 7 channel synth 37 // 7 channel synth
39 signed short *tonebank0; // source of waveform 38 signed short *tonebank0; // source of waveform
40 signed short *tonebank1; 39 signed short *tonebank1;
41 signed short *tonebank2; 40 signed short *tonebank2;
42 signed short *tonebank3; 41 signed short *tonebank3;
43 signed short *tonebank4; 42 signed short *tonebank4;
44 signed short *tonebank5; 43 signed short *tonebank5;
45 signed short *tonebank6; 44 signed short *tonebank6;
46 int tonebank_length0; 45 int tonebank_length0;
47 int tonebank_length1; 46 int tonebank_length1;
48 int tonebank_length2; 47 int tonebank_length2;
49 int tonebank_length3; 48 int tonebank_length3;
50 int tonebank_length4; 49 int tonebank_length4;
51 int tonebank_length5; 50 int tonebank_length5;
52 int tonebank_length6; 51 int tonebank_length6;
53 int pb_rate0; // playback rate or 0 52 int pb_rate0; // playback rate or 0
54 int pb_rate1; 53 int pb_rate1;
55 int pb_rate2; 54 int pb_rate2;
56 int pb_rate3; 55 int pb_rate3;
57 int pb_rate4; 56 int pb_rate4;
58 int pb_rate5; 57 int pb_rate5;
59 int pb_rate6; 58 int pb_rate6;
60 int pb_ratio0; // accumulator for ratio 59 int pb_ratio0; // accumulator for ratio
61 int pb_ratio1; 60 int pb_ratio1;
62 int pb_ratio2; 61 int pb_ratio2;
63 int pb_ratio3; 62 int pb_ratio3;
64 int pb_ratio4; 63 int pb_ratio4;
65 int pb_ratio5; 64 int pb_ratio5;
66 int pb_ratio6; 65 int pb_ratio6;
67 int pb_rsc0; // pointer to current position 66 int pb_rsc0; // pointer to current position
68 int pb_rsc1; 67 int pb_rsc1;
69 int pb_rsc2; 68 int pb_rsc2;
70 int pb_rsc3; 69 int pb_rsc3;
71 int pb_rsc4; 70 int pb_rsc4;
72 int pb_rsc5; 71 int pb_rsc5;
73 int pb_rsc6; 72 int pb_rsc6;
74 int pb_oct0; // octave 73 int pb_oct0; // octave
75 int pb_oct1; 74 int pb_oct1;
76 int pb_oct2; 75 int pb_oct2;
77 int pb_oct3; 76 int pb_oct3;
78 int pb_oct4; 77 int pb_oct4;
79 int pb_oct5; 78 int pb_oct5;
80 int pb_oct6; 79 int pb_oct6;
81 80
82 void set_tonebank(int bank, signed short *buffer, int length); 81 void set_tonebank(int bank, signed short *buffer, int length);
83 protected: 82 protected:
84 83
85 public: 84 public:
86 static const int MUTED=7; 85 static const int MUTED=7;
87 static const int OPEN=0; 86 static const int OPEN=0;
88 87
89 // accessors 88 // accessors
90 int Frames(){return frames;}; 89 int Frames(){return frames;};
91 int Finger(int finger); 90 int Finger(int finger);
92 int Fret(){return initial_fret;}; 91 int Fret(){return initial_fret;};
93 int Playing(){ 92 int Playing(){
94 if (pb_rate0 == 0 && 93 if (pb_rate0 == 0 &&
95 pb_rate1 == 0 && 94 pb_rate1 == 0 &&
96 pb_rate2 == 0 && 95 pb_rate2 == 0 &&
97 pb_rate3 == 0 && 96 pb_rate3 == 0 &&
98 pb_rate4 == 0 && 97 pb_rate4 == 0 &&
99 pb_rate5 == 0 && 98 pb_rate5 == 0 &&
100 pb_rate6 == 0) return 0; 99 pb_rate6 == 0) return 0;
101 return 1; 100 return 1;
102 }; 101 };
103 102
104 public : 103 public :
105 // mutators 104 // mutators
106 void Reverb(int size){reverb_max = 64 * size;}; 105 void Reverb(int size){reverb_max = 64 * size;};
107 void Finger(int finger, int position); 106 void Finger(int finger, int position);
108 void Fret(int position){initial_fret = position;}; 107 void Fret(int position){initial_fret = position;};
109 void Tuning(int t[6]); 108 void Tuning(int t[6]);
110 void note_start(int chan, int note, int octave); 109 void note_start(int chan, int note, int octave);
111 110
112 // methods 111 // methods
113 int Play(); 112 int Play();
114 void fill_buffer(); 113 void fill_buffer();
115 void write_buffer(); 114 void write_buffer();
116 void Stop(); 115 void Stop();
117}; 116};
118 117
119#endif 118#endif
120 119
121 120
122 121
123 122
124 123
diff --git a/noncore/multimedia/powerchord/opie-powerchord.control b/noncore/multimedia/powerchord/opie-powerchord.control
index 7f45999..d295031 100644
--- a/noncore/multimedia/powerchord/opie-powerchord.control
+++ b/noncore/multimedia/powerchord/opie-powerchord.control
@@ -1,10 +1,10 @@
1Files: bin/powerchord apps/Applications/powerchord.desktop pics/powerchord sounds/powerchord 1Files: bin/powerchord apps/Applications/powerchord.desktop pics/powerchord share/powerchord
2Priority: optional 2Priority: optional
3Section: qpe/applications 3Section: Applications
4Maintainer: Camilo Mesias <camilo@mesias.co.uk> 4Maintainer: Camilo Mesias <camilo@mesias.co.uk>
5Architecture: arm 5Architecture: arm
6Version: 0.0.7 6Version: 0.0.8
7Depends: qpe-base ($QPE_VERSION) 7Depends: task-opie-minimal
8Description: Guitar Chord generator application 8Description: Guitar Chord generator application
9Allows naming of chords using base note and key. Fretboard diagrams are 9Allows naming of chords using base note and key. Fretboard diagrams are
10produced illustrating ways to play the chord. 10produced illustrating ways to play the chord.
diff --git a/share/powerchord/acguitar.raw b/share/powerchord/acguitar.raw
new file mode 100644
index 0000000..1452147
--- a/dev/null
+++ b/share/powerchord/acguitar.raw
Binary files differ