summaryrefslogtreecommitdiff
Unidiff
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,460 +1,465 @@
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);
225 } 230 }
226 231
227 speed = 11025; 232 speed = 11025;
228 233
229 if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed) == -1){ 234 if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed) == -1){
230 fprintf(stderr, "Error SNDCTL DSP SPEED, %s\n", strerror(errno)); 235 fprintf(stderr, "Error SNDCTL DSP SPEED, %s\n", strerror(errno));
231 exit(0); 236 exit(0);
232 } 237 }
233 238
234 // buffering q's 239 // buffering q's
235 //audio_buf_info info; 240 //audio_buf_info info;
236 //if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info) == -1){ 241 //if (ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &info) == -1){
237 // fprintf(stderr, "Error SNDCTL DSP GETOSPACE, %s\n", strerror(errno)); 242 // fprintf(stderr, "Error SNDCTL DSP GETOSPACE, %s\n", strerror(errno));
238 // exit(0); 243 // exit(0);
239 //} 244 //}
240 //fprintf(stderr, "fragments %d\nfragstotal %d\nfragsize %d\nbytes %d\n", info.fragments, info.fragstotal, info.fragsize, info.bytes); 245 //fprintf(stderr, "fragments %d\nfragstotal %d\nfragsize %d\nbytes %d\n", info.fragments, info.fragstotal, info.fragsize, info.bytes);
241 246
242 247
243 248
244// audio math. 249// audio math.
245// A4 = 440Hz 250// A4 = 440Hz
246// +1 octave = 2x freq 251// +1 octave = 2x freq
247// -1 octave = /2 freq. 252// -1 octave = /2 freq.
248// +1 semitone = *= 12 root 2; 253// +1 semitone = *= 12 root 2;
249// ie. * 1.059463094 254// ie. * 1.059463094
250 255
251// tones, approx Hz, samples at 11025 256// tones, approx Hz, samples at 11025
252// A4 440 25 257// A4 440 25
253// A#4 466 24 258// A#4 466 24
254// B4 494 22 259// B4 494 22
255// C4 523 21 260// C4 523 21
256// C#4 554 20 261// C#4 554 20
257// D4 587 19 262// D4 587 19
258// D#4 622 18 263// D#4 622 18
259// E4 659 17 264// E4 659 17
260// F4 698 16 265// F4 698 16
261// F#4 740 15 266// F#4 740 15
262// G4 784 14 267// G4 784 14
263// G#4 831 13 268// G#4 831 13
264 269
265 270
266 } 271 }
267 else{ 272 else{
268 fprintf(stderr, "Already playing\n"); 273 fprintf(stderr, "Already playing\n");
269 } 274 }
270 275
271 return 0; 276 return 0;
272} 277}
273 278
274void gs::note_start(int chan, int note, int octave) 279void gs::note_start(int chan, int note, int octave)
275{ 280{
276 switch (chan){ 281 switch (chan){
277 282
278 case 0: 283 case 0:
279 pb_rate0 = note_periods[note]; 284 pb_rate0 = note_periods[note];
280 pb_oct0 = octave_step[octave]; 285 pb_oct0 = octave_step[octave];
281 pb_ratio0 = 0; 286 pb_ratio0 = 0;
282 pb_rsc0 = 0; 287 pb_rsc0 = 0;
283 break; 288 break;
284 case 1: 289 case 1:
285 pb_rate1 = note_periods[note]; 290 pb_rate1 = note_periods[note];
286 pb_oct1 = octave_step[octave]; 291 pb_oct1 = octave_step[octave];
287 pb_ratio1 = 0; 292 pb_ratio1 = 0;
288 pb_rsc1 = 0; 293 pb_rsc1 = 0;
289 break; 294 break;
290 case 2: 295 case 2:
291 pb_rate2 = note_periods[note]; 296 pb_rate2 = note_periods[note];
292 pb_oct2 = octave_step[octave]; 297 pb_oct2 = octave_step[octave];
293 pb_ratio2 = 0; 298 pb_ratio2 = 0;
294 pb_rsc2 = 0; 299 pb_rsc2 = 0;
295 break; 300 break;
296 case 3: 301 case 3:
297 pb_rate3 = note_periods[note]; 302 pb_rate3 = note_periods[note];
298 pb_oct3 = octave_step[octave]; 303 pb_oct3 = octave_step[octave];
299 pb_ratio3 = 0; 304 pb_ratio3 = 0;
300 pb_rsc3 = 0; 305 pb_rsc3 = 0;
301 break; 306 break;
302 case 4: 307 case 4:
303 pb_rate4 = note_periods[note]; 308 pb_rate4 = note_periods[note];
304 pb_oct4 = octave_step[octave]; 309 pb_oct4 = octave_step[octave];
305 pb_ratio4 = 0; 310 pb_ratio4 = 0;
306 pb_rsc4 = 0; 311 pb_rsc4 = 0;
307 break; 312 break;
308 case 5: 313 case 5:
309 pb_rate5 = note_periods[note]; 314 pb_rate5 = note_periods[note];
310 pb_oct5 = octave_step[octave]; 315 pb_oct5 = octave_step[octave];
311 pb_ratio5 = 0; 316 pb_ratio5 = 0;
312 pb_rsc5 = 0; 317 pb_rsc5 = 0;
313 break; 318 break;
314 case 6: 319 case 6:
315 pb_rate6 = note_periods[note]; 320 pb_rate6 = note_periods[note];
316 pb_oct6 = octave_step[octave]; 321 pb_oct6 = octave_step[octave];
317 pb_ratio6 = 0; 322 pb_ratio6 = 0;
318 pb_rsc6 = 0; 323 pb_rsc6 = 0;
319 break; 324 break;
320 default: 325 default:
321 fprintf(stderr, "Bad channel\n"); 326 fprintf(stderr, "Bad channel\n");
322 exit(-1); 327 exit(-1);
323 } 328 }
324 329
325 330
326} 331}
327 332
328void gs::write_buffer(){ 333void gs::write_buffer(){
329 int num_read; 334 int num_read;
330 num_read = write(audio_fd, (void *)audio_buf, BUFSIZE*2); 335 num_read = write(audio_fd, (void *)audio_buf, BUFSIZE*2);
331 // fprintf(stderr, "Wrote %d bytes\n", num_read); 336 // fprintf(stderr, "Wrote %d bytes\n", num_read);
332} 337}
333 338
334void gs::fill_buffer() 339void gs::fill_buffer()
335{ 340{
336 frames ++; 341 frames ++;
337 342
338 int i; 343 int i;
339 344
340 for (i=0;i<BUFSIZE;i++){ 345 for (i=0;i<BUFSIZE;i++){
341 346
342 audio_buf[i] = 0; 347 audio_buf[i] = 0;
343 348
344 if (pb_rate0){ 349 if (pb_rate0){
345 audio_buf[i] += tonebank0[pb_rsc0]; 350 audio_buf[i] += tonebank0[pb_rsc0];
346 pb_rsc0 += pb_oct0; 351 pb_rsc0 += pb_oct0;
347 pb_ratio0 += 90703; 352 pb_ratio0 += 90703;
348 pb_ratio0 -= pb_rate0; 353 pb_ratio0 -= pb_rate0;
349 if (pb_ratio0 >= pb_rate0){ 354 if (pb_ratio0 >= pb_rate0){
350 pb_rsc0 += pb_oct0; 355 pb_rsc0 += pb_oct0;
351 pb_ratio0 -= pb_rate0; 356 pb_ratio0 -= pb_rate0;
352 357
353 } 358 }
354 if (pb_rsc0 >= tonebank_length0) pb_rate0 = 0; 359 if (pb_rsc0 >= tonebank_length0) pb_rate0 = 0;
355 } 360 }
356 361
357 if (pb_rate1){ 362 if (pb_rate1){
358 audio_buf[i] += tonebank1[pb_rsc1]; 363 audio_buf[i] += tonebank1[pb_rsc1];
359 pb_rsc1 += pb_oct1; 364 pb_rsc1 += pb_oct1;
360 pb_ratio1 += 90703; 365 pb_ratio1 += 90703;
361 pb_ratio1 -= pb_rate1; 366 pb_ratio1 -= pb_rate1;
362 if (pb_ratio1 >= pb_rate1){ 367 if (pb_ratio1 >= pb_rate1){
363 pb_rsc1 += pb_oct1; 368 pb_rsc1 += pb_oct1;
364 pb_ratio1 -= pb_rate1; 369 pb_ratio1 -= pb_rate1;
365 370
366 } 371 }
367 if (pb_rsc1 >= tonebank_length1) pb_rate1 = 0; 372 if (pb_rsc1 >= tonebank_length1) pb_rate1 = 0;
368 } 373 }
369 374
370 if (pb_rate2){ 375 if (pb_rate2){
371 audio_buf[i] += tonebank2[pb_rsc2]; 376 audio_buf[i] += tonebank2[pb_rsc2];
372 pb_rsc2 += pb_oct2; 377 pb_rsc2 += pb_oct2;
373 pb_ratio2 += 90703; 378 pb_ratio2 += 90703;
374 pb_ratio2 -= pb_rate2; 379 pb_ratio2 -= pb_rate2;
375 if (pb_ratio2 >= pb_rate2){ 380 if (pb_ratio2 >= pb_rate2){
376 pb_rsc2 += pb_oct2; 381 pb_rsc2 += pb_oct2;
377 pb_ratio2 -= pb_rate2; 382 pb_ratio2 -= pb_rate2;
378 383
379 } 384 }
380 if (pb_rsc2 >= tonebank_length2) pb_rate2 = 0; 385 if (pb_rsc2 >= tonebank_length2) pb_rate2 = 0;
381 } 386 }
382 387
383 if (pb_rate3){ 388 if (pb_rate3){
384 audio_buf[i] += tonebank3[pb_rsc3]; 389 audio_buf[i] += tonebank3[pb_rsc3];
385 pb_rsc3 += pb_oct3; 390 pb_rsc3 += pb_oct3;
386 pb_ratio3 += 90703; 391 pb_ratio3 += 90703;
387 pb_ratio3 -= pb_rate3; 392 pb_ratio3 -= pb_rate3;
388 if (pb_ratio3 >= pb_rate3){ 393 if (pb_ratio3 >= pb_rate3){
389 pb_rsc3 += pb_oct3; 394 pb_rsc3 += pb_oct3;
390 pb_ratio3 -= pb_rate3; 395 pb_ratio3 -= pb_rate3;
391 396
392 } 397 }
393 if (pb_rsc3 >= tonebank_length3) pb_rate3 = 0; 398 if (pb_rsc3 >= tonebank_length3) pb_rate3 = 0;
394 } 399 }
395 400
396 if (pb_rate4){ 401 if (pb_rate4){
397 audio_buf[i] += tonebank4[pb_rsc4]; 402 audio_buf[i] += tonebank4[pb_rsc4];
398 pb_rsc4 += pb_oct4; 403 pb_rsc4 += pb_oct4;
399 pb_ratio4 += 90703; 404 pb_ratio4 += 90703;
400 pb_ratio4 -= pb_rate4; 405 pb_ratio4 -= pb_rate4;
401 if (pb_ratio4 >= pb_rate4){ 406 if (pb_ratio4 >= pb_rate4){
402 pb_rsc4 += pb_oct4; 407 pb_rsc4 += pb_oct4;
403 pb_ratio4 -= pb_rate4; 408 pb_ratio4 -= pb_rate4;
404 409
405 } 410 }
406 if (pb_rsc4 >= tonebank_length4) pb_rate4 = 0; 411 if (pb_rsc4 >= tonebank_length4) pb_rate4 = 0;
407 } 412 }
408 413
409 if (pb_rate5){ 414 if (pb_rate5){
410 audio_buf[i] += tonebank5[pb_rsc5]; 415 audio_buf[i] += tonebank5[pb_rsc5];
411 pb_rsc5 += pb_oct5; 416 pb_rsc5 += pb_oct5;
412 pb_ratio5 += 90703; 417 pb_ratio5 += 90703;
413 pb_ratio5 -= pb_rate5; 418 pb_ratio5 -= pb_rate5;
414 if (pb_ratio5 >= pb_rate5){ 419 if (pb_ratio5 >= pb_rate5){
415 pb_rsc5 += pb_oct5; 420 pb_rsc5 += pb_oct5;
416 pb_ratio5 -= pb_rate5; 421 pb_ratio5 -= pb_rate5;
417 422
418 } 423 }
419 if (pb_rsc5 >= tonebank_length5) pb_rate5 = 0; 424 if (pb_rsc5 >= tonebank_length5) pb_rate5 = 0;
420 } 425 }
421 426
422 if (pb_rate6){ 427 if (pb_rate6){
423 audio_buf[i] += tonebank6[pb_rsc6]; 428 audio_buf[i] += tonebank6[pb_rsc6];
424 pb_rsc6 += pb_oct6; 429 pb_rsc6 += pb_oct6;
425 pb_ratio6 += 90703; 430 pb_ratio6 += 90703;
426 pb_ratio6 -= pb_rate6; 431 pb_ratio6 -= pb_rate6;
427 if (pb_ratio6 >= pb_rate6){ 432 if (pb_ratio6 >= pb_rate6){
428 pb_rsc6 += pb_oct6; 433 pb_rsc6 += pb_oct6;
429 pb_ratio6 -= pb_rate6; 434 pb_ratio6 -= pb_rate6;
430 435
431 } 436 }
432 if (pb_rsc6 >= tonebank_length6) pb_rate6 = 0; 437 if (pb_rsc6 >= tonebank_length6) pb_rate6 = 0;
433 } 438 }
434 439
435 // do reverb 440 // do reverb
436 signed short rtmp = reverb[reverb_ptr]; 441 signed short rtmp = reverb[reverb_ptr];
437 reverb[reverb_ptr] /= 2; 442 reverb[reverb_ptr] /= 2;
438 reverb[reverb_ptr] += audio_buf[i]/4; 443 reverb[reverb_ptr] += audio_buf[i]/4;
439 audio_buf[i] += rtmp; 444 audio_buf[i] += rtmp;
440 reverb_ptr++; 445 reverb_ptr++;
441 if (reverb_ptr >= reverb_max) reverb_ptr = 0; 446 if (reverb_ptr >= reverb_max) reverb_ptr = 0;
442 } 447 }
443} 448}
444 449
445 450
446void gs::Stop(){ 451void gs::Stop(){
447 if (audio_fd == -1){ 452 if (audio_fd == -1){
448 fprintf(stderr, "Already stopped\n"); 453 fprintf(stderr, "Already stopped\n");
449 } 454 }
450 else{ 455 else{
451 //ioctl(audio_fd, SNDCTL_DSP_RESET, 0); 456 //ioctl(audio_fd, SNDCTL_DSP_RESET, 0);
452 457
453 close(audio_fd); 458 close(audio_fd);
454 audio_fd = -1; 459 audio_fd = -1;
455 } 460 }
456 461
457} 462}
458 463
459gs::~gs() 464gs::~gs()
460{} 465{}
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