summaryrefslogtreecommitdiffstats
path: root/drivers/sound/softoss.h
blob: 42dab13dcd56f5aacf69335eb2db0746c44c968a (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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
 * softoss.h	- Definitions for Software MIDI Synthesizer.
 */
/*
 * Copyright (C) by Hannu Savolainen 1993-1997
 *
 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
 * Version 2 (June 1991). See the "COPYING" file distributed with this software
 * for more info.
 */


/*
 * Sequencer mode1 timer calls made by sequencer.c
 */
extern int (*softsynthp) (int cmd, int parm1, int parm2, unsigned long parm3);

#define SSYN_START	1
#define SSYN_REQUEST	2	/* parm1 = time */
#define SSYN_STOP	3
#define SSYN_GETTIME	4	/* Returns number of ticks since reset */

#define MAX_PATCH 256
#define MAX_SAMPLE 512
#define MAX_VOICE 32
#define DEFAULT_VOICES 16

typedef struct voice_info
{
/*
 * Don't change anything in the beginning of this struct. These fields are used
 * by the resampling loop which may have been written in assembly for some
 * architectures. Any change may make the resampling code incompatible
 */
  int instr;
  short *wave;
  struct patch_info *sample;

  unsigned int ptr; int step; /* Pointer to the wave data and pointer increment */

  int mode;
  int startloop, startbackloop, endloop, looplen;

  unsigned int leftvol, rightvol;
/***** Don't change anything above this */

  volatile unsigned long orig_freq, current_freq;
  volatile int bender, bender_range, panning;
  volatile int main_vol, expression_vol, patch_vol, velocity;

/* Envelope parameters */

  int envelope_phase;
  volatile int envelope_vol;
  volatile int envelope_volstep;
  int envelope_time; /* Number of remaining envelope steps */
  unsigned int envelope_target;
  int percussive_voice;
  int sustain_mode; /* 0=off, 1=sustain on, 2=sustain on+key released */

/*	Vibrato	*/
  int vibrato_rate;
  int vibrato_depth;
  int vibrato_phase;
  int vibrato_step;
  int vibrato_level;

/*	Tremolo	*/
  int tremolo_rate;
  int tremolo_depth;
  int tremolo_phase;
  int tremolo_step;
  int tremolo_level;
} voice_info;

extern voice_info softoss_voices[MAX_VOICE]; /* Voice spesific info */

typedef struct softsyn_devc
{
/*
 * Don't change anything in the beginning of this struct. These fields are used
 * by the resampling loop which may have been written in assembly for some
 * architectures. Any change may make the resampling code incompatible
 */
	int maxvoice;		/* # of voices to be processed */
  	int afterscale;
	int delay_size;
  	int control_rate, control_counter;
/***** Don't change anything above this */

	int ram_size;
	int ram_used;

	int synthdev;
	int timerdev;
	int sequencer_mode;
/*
 *	Audio parameters
 */

	int audiodev;
	int audio_opened;
	int speed;
	int channels;
	int bits;
	int default_max_voices;
	int max_playahead;
	struct file finfo;
	int fragsize;
	int samples_per_fragment;
	
/*
 * 	Sample storage
 */
	int nrsamples;
	struct patch_info *samples[MAX_SAMPLE];
	short *wave[MAX_SAMPLE];

/*
 * 	Programs
 */
	int programs[MAX_PATCH];

/*
 *	Timer parameters
 */
	volatile unsigned long usecs;
	volatile unsigned long usecs_per_frag;
	volatile unsigned long next_event_usecs;

/*
 * 	Engine state
 */

	volatile int engine_state;
#define ES_STOPPED			0
#define ES_STARTED			1

	/* Voice spesific bitmaps */
	volatile int tremolomap; 
	volatile int vibratomap;

} softsyn_devc;

void softsynth_resample_loop(short *buf, int loops);
extern void softsyn_control_loop(void);

#define DELAY_SIZE	4096

#ifdef SOFTSYN_MAIN
  short voice_active[MAX_VOICE] = {0};
  voice_info softoss_voices[MAX_VOICE] = {{0}}; /* Voice spesific info */
  int left_delay[DELAY_SIZE]={0}, right_delay[DELAY_SIZE]={0};
  int delayp=0;
#else
  extern softsyn_devc *devc;

  extern int left_delay[DELAY_SIZE], right_delay[DELAY_SIZE];
  extern int delayp;
  extern short voice_active[MAX_VOICE];
#endif