summaryrefslogtreecommitdiff
path: root/noncore/multimedia/powerchord/gs.h
blob: 3e4c04dbf01f5adaa30ce708213470ae9839e287 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

#ifndef __GS_H
#define __GS_H

#include <qobject.h>
// sound includes
#include <sys/soundcard.h>

#define BUFSIZE 256
#define NUMCHANS 7
#define ACGUITAR_PATH_S "/usr/local/projects/opie-head/noncore/multimedia/powerchord/acguitar.raw"

class gs : public QObject {

  Q_OBJECT

  public:
  gs();
  ~gs();

 private:

  int initial_fret;
  int finger[6];
  int tuning[6];

  signed short *reverb;
  int reverb_ptr;
  int reverb_max;

  int audio_fd;
  signed short audio_buf[BUFSIZE];
  static int note_periods[12];
  static int octave_step[6];
  int frames;


  // 7 channel synth
  signed short *tonebank0; // source of waveform
  signed short *tonebank1;
  signed short *tonebank2;
  signed short *tonebank3;
  signed short *tonebank4;
  signed short *tonebank5;
  signed short *tonebank6;
  int tonebank_length0;
  int tonebank_length1;
  int tonebank_length2;
  int tonebank_length3;
  int tonebank_length4;
  int tonebank_length5;
  int tonebank_length6;
  int pb_rate0; // playback rate or 0
  int pb_rate1;
  int pb_rate2;
  int pb_rate3;
  int pb_rate4;
  int pb_rate5;
  int pb_rate6;
  int pb_ratio0; // accumulator for ratio
  int pb_ratio1;
  int pb_ratio2;
  int pb_ratio3;
  int pb_ratio4;
  int pb_ratio5;
  int pb_ratio6;
  int pb_rsc0; // pointer to current position
  int pb_rsc1;
  int pb_rsc2;
  int pb_rsc3;
  int pb_rsc4;
  int pb_rsc5;
  int pb_rsc6;
  int pb_oct0; // octave
  int pb_oct1;
  int pb_oct2;
  int pb_oct3;
  int pb_oct4;
  int pb_oct5;
  int pb_oct6;

  void set_tonebank(int bank, signed short *buffer, int length);
 protected:

 public:
  static const int MUTED=7;
  static const int OPEN=0;

  // accessors
  int Frames(){return frames;};
  int Finger(int finger);
  int Fret(){return initial_fret;};
  int Playing(){
    if (pb_rate0 == 0 &&
	pb_rate1 == 0 &&
	pb_rate2 == 0 &&
	pb_rate3 == 0 &&
	pb_rate4 == 0 &&
	pb_rate5 == 0 &&
	pb_rate6 == 0) return 0;
    return 1;
  };

 public :
  // mutators
      void Reverb(int size){reverb_max = 64 * size;};
  void Finger(int finger, int position);
  void Fret(int position){initial_fret = position;};
  void Tuning(int t[6]);
  void note_start(int chan, int note, int octave);
  
  // methods
  int Play();
  void fill_buffer();
  void write_buffer();
  void Stop();
};

#endif