OSDN Git Service

最初のコミット
[winaudioj/stedx.git] / rcdcheck.cpp
1 /* rcdcheck.c
2
3    RCD stay check functions
4    compatible to rcdcheck.s
5
6    Made by Studio Breeze. 1998
7
8
9   Permission is hereby granted, free of charge, to any person obtaining a copy
10   of this software and associated documentation files (the "Software"), to deal
11   in the Software without restriction, including without limitation the rights
12   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13   copies of the Software, and to permit persons to whom the Software is
14   furnished to do so, subject to the following conditions:
15
16   The above copyright notice and this permission notice shall be included in
17   all copies or substantial portions of the Software.
18
19   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
22   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25   THE SOFTWARE.
26 */
27
28 #include "sted.h"
29 #include "sted_screen.h"
30
31 #define MAX_BAR      2048            /* max size of measure is 2048 */
32 static int bar_st[TRK_NUM][MAX_BAR];
33
34 //struct RCD_HEAD  *rcd;
35 static char *_data_adr, *_tone_adr, *_word_adr, *_gsd_adr, *_smf_adr;
36
37 static void request_midi_data(char *);
38
39 static void _start_external_player(void);
40 static void _stop_external_player(void);
41 static void _exit_external_player(int);
42 static void null_func (void) {};
43 static void null_func_char (char in_a) {};
44
45 /** RCD 構造体の初期化を行う コンストラクタのようなもの */
46 void
47 rcd_check( void ) {
48   int i;
49   int alloc_size;
50
51   /* memory allocation */
52
53   alloc_size =
54     sizeof(struct RCD_HEAD)+
55     sizeof(char)*
56     (DATA_ADR_SIZE +
57      SMF_ADR_SIZE +
58      TONE_ADR_SIZE +
59      WORD_ADR_SIZE +
60      GSD_ADR_SIZE);
61
62   rcd = (struct RCD_HEAD *)malloc( alloc_size );
63   _data_adr = (char *)rcd + sizeof(struct RCD_HEAD);
64   _smf_adr  = _data_adr + DATA_ADR_SIZE;
65   _tone_adr = _smf_adr  + SMF_ADR_SIZE;
66   _word_adr = _tone_adr + TONE_ADR_SIZE;
67   _gsd_adr  = _word_adr + WORD_ADR_SIZE;
68
69   rcd_version[0] = '3';
70   rcd_version[1] = '.';
71   rcd_version[2] = '0';
72   rcd_version[3] = '1';
73
74   rcd->title[0] = 'R';
75   rcd->title[1] = 'C';
76   rcd->title[2] = 'D';
77   rcd->title[3] = ' ';
78
79   rcd->version[0] = '3';
80   rcd->version[1] = '.';
81   rcd->version[2] = '0';
82   rcd->version[3] = '1';
83
84   rcd->staymark = 0;
85
86   rcd->data_valid = 1;
87   rcd->tone_valid = 0;
88   rcd->word_valid = 0;
89   rcd->gsd_valid = 0;
90   rcd->fmt = 1;
91
92   rcd->data_adr = _data_adr;
93   rcd->tone_adr = _tone_adr;
94   rcd->word_adr = _word_adr;
95   rcd->gsd_adr  = _gsd_adr;
96   rcd->smf_adr  = _smf_adr;
97
98   rcd->init  = null_func;              /* RCD initialize ? */
99   rcd->setup = null_func;              /* RCD setup routine ? */
100   rcd->begin = _start_external_player;  /* start playing RCP data */
101   rcd->end = _stop_external_player;    /* stop playing RCP data */
102
103   rcd->md_put = put_midi_data;
104   rcd->md_get = get_midi_data;
105   rcd->md_put2 = null_func_char;
106   rcd->mix_out = request_midi_data;
107
108   rcd->act = 0;
109   rcd->sts = 1;
110   rcd->tar_trk = 0;
111   rcd->tar_bar = 0;
112
113   rcd->dummy1[0] = 0;
114
115   rcd->tempo = 64;
116   rcd->basetempo = 64;
117
118   rcd->totalcount = 0;
119   rcd->filename[0] = 0;
120   rcd->tonename[0] = 0;
121
122   rcd->dummy2[0] = 0;
123
124   rcd->bufcap = DATA_ADR_SIZE;
125
126   rcd->MIDI_avl = 0;
127   rcd->MIDI_req[0] = 0;
128
129   for( i=0;i<TRK_NUM;i++ ) {
130     rcd->active[i]=1;
131     rcd->bar[i]=0;
132     rcd->step[i]=0;
133   }
134   rcd->stepcount = 0;
135 }
136
137 void rcd_open_device( void ) {
138   open_midi_device( midi_port_name );
139   return;
140 }
141
142 void
143 _start_external_player(void)
144 {
145     if ( STed_InitMeasureConversion() !=0 ) return;
146
147         start_player((unsigned char *)_data_adr, rcd->totalcount);
148 }
149
150 void
151 _stop_external_player(void)
152 {
153         stop_player();
154 }
155
156 void
157 _exit_external_player(int in_sig)
158 {
159         close_player(in_sig);
160 }
161
162 void
163 request_midi_data(char *in_p)
164 {
165 }
166
167  int add_set(int, int*);
168  int step_cluc2(int, int, int);
169  int meas_add(int);
170
171 int
172 STed_InitMeasureConversion() {
173
174   int i,j;
175   int *measure;
176   int m;
177
178   for( i=0;i<TRK_NUM;i++ ) {
179     rcd->active[i]=1;
180     rcd->bar[i]=0;
181     rcd->step[i]=0;
182   }
183   rcd->stepcount = 0;
184
185   measure = (int *)malloc(sizeof(int)*MAX_BAR);
186   for ( i=0 ; i<TRK_NUM ; i++ ) {
187     m=add_set( i, measure );
188     for ( j=0 ; j<m ; j++ ) {
189       bar_st[i][j] = step_cluc2( i, 0, measure[j] );
190     }
191     bar_st[i][m]=-1;
192   }
193   free(measure);
194
195   return 0;
196 }
197
198 /* converts from total step to measure & relative step */
199 static int stp_ad( int tr, int meas, int step );
200 int
201 STed_MeasureConversion( int tr ) {
202
203   int i;
204   int c=rcd->stepcount;
205
206   if ( rcd->bar[tr]>=0 || rcd->step[tr]>=0 ) return 0;
207
208   i=0;
209   while (i<MAX_BAR) {
210     if ( bar_st[tr][i]>c ) break;
211     if ( bar_st[tr][i]<0 ) i=MAX_BAR;
212     i++;
213   }
214   i--;
215   
216   if ( i==MAX_BAR-1 ) {   /* measures ended */
217     rcd->bar[tr]=0;
218     rcd->step[tr]=0;
219     rcd->active[tr]=0;
220   } else {
221     rcd->active[tr]=1;
222     rcd->bar[tr] = i;
223     rcd->step[tr] = stp_ad(tr, i, c-bar_st[tr][i]);
224   }
225
226   return 0;
227 }
228
229 static int
230 stp_ad( int t, int measure, int step ) {
231
232   unsigned char a;
233   int po;
234   int tr;
235   int s;
236   unsigned char *bp=trk[t];
237
238   measure+=(poft&0xffff);
239   if (( poft&0xffff)==0 ) measure++;
240   tr=track;
241   track=t;
242   po = meas_add(measure);
243   track=tr;
244
245   s=1;
246   while (step>0) {
247   redis:
248     a=bp[po];
249     if(a==0xf7){po+=4;goto redis;}
250     if(a>=0xfc ) break;
251
252     if ( a<0xf0 ) {
253       step-=bp[po+1];
254       if (step<0) break;
255     }
256     s++;
257     po=po+4;
258   }
259
260   return s;
261 }
262