/[svn]/linuxsampler/trunk/src/network/lscp.y
ViewVC logotype

Annotation of /linuxsampler/trunk/src/network/lscp.y

Parent Directory Parent Directory | Revision Log Revision Log


Revision 973 - (hide annotations) (download)
Fri Dec 15 21:40:27 2006 UTC (17 years, 3 months ago) by schoenebeck
File size: 41021 byte(s)
* revised and extended MIDI instrument mapping feature to allow managing
  arbitrary amount of maps and assigning each sampler channel individually
  to one map (this commit batch includes LSCP spec document update and
  respective implementation on LS side)

1 schoenebeck 35 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 schoenebeck 56 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 schoenebeck 826 * Copyright (C) 2005, 2006 Christian Schoenebeck *
7 schoenebeck 35 * *
8     * This program is free software; you can redistribute it and/or modify *
9     * it under the terms of the GNU General Public License as published by *
10     * the Free Software Foundation; either version 2 of the License, or *
11     * (at your option) any later version. *
12     * *
13     * This program is distributed in the hope that it will be useful, *
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16     * GNU General Public License for more details. *
17     * *
18     * You should have received a copy of the GNU General Public License *
19     * along with this program; if not, write to the Free Software *
20     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
21     * MA 02111-1307 USA *
22     ***************************************************************************/
23    
24 schoenebeck 947 /* CAUTION: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
25     /* */
26     /* don't forget to run 'make parser' after you changed this file, */
27     /* otherwise the parser will not be regenerated ! */
28     /* */
29     /* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
30 schoenebeck 210
31 schoenebeck 35 %{
32    
33     #include "lscpparser.h"
34     #include "lscpserver.h"
35 senkov 170 #include "lscpevent.h"
36 schoenebeck 35
37     // to save us typing work in the rules action definitions
38     #define LSCPSERVER ((yyparse_param_t*) yyparse_param)->pServer
39    
40 schoenebeck 219 // clears input buffer
41 schoenebeck 35 void restart(yyparse_param_t* pparam, int& yychar);
42     #define RESTART restart((yyparse_param_t*) YYPARSE_PARAM, yychar)
43    
44     // we provide our own version of yyerror() so we don't have to link against the yacc library
45     void yyerror(const char* s);
46    
47 schoenebeck 219 static char buf[1024]; // input buffer to feed the parser with new characters
48     static int bytes = 0; // current number of characters in the input buffer
49     static int ptr = 0; // current position in the input buffer
50    
51     // external reference to the function which actually reads from the socket
52     extern int GetLSCPCommand( void *buf, int max_size);
53    
54     // custom scanner function which reads from the socket
55     int yylex(YYSTYPE* yylval) {
56     // check if we have to read new characters
57     if (ptr >= bytes) {
58     bytes = GetLSCPCommand(buf, 1023);
59     ptr = 0;
60     if (bytes < 0) {
61     bytes = 0;
62     return 0;
63     }
64     }
65     return (int) buf[ptr++];
66     }
67    
68 schoenebeck 35 %}
69    
70     // reentrant parser
71     %pure_parser
72    
73 schoenebeck 219 %type <Char> char digit
74     %type <Dotnum> dotnum volume_value boolean
75 schoenebeck 973 %type <Number> number sampler_channel instrument_index audio_channel_index device_index midi_input_channel_index midi_input_port_index midi_map midi_bank midi_prog
76     %type <String> string text stringval digits param_val_list param_val filename map_name entry_name engine_name command add_instruction create_instruction destroy_instruction get_instruction list_instruction load_instruction set_chan_instruction load_instr_args load_engine_args audio_output_type_name midi_input_type_name remove_instruction unmap_instruction set_instruction subscribe_event unsubscribe_event map_instruction reset_instruction clear_instruction
77 schoenebeck 35 %type <FillResponse> buffer_size_type
78 schoenebeck 123 %type <KeyValList> key_val_list
79 schoenebeck 947 %type <LoadMode> instr_load_mode
80 schoenebeck 35
81     %start input
82    
83     %%
84    
85     //TODO: return more meaningful error messages
86    
87 schoenebeck 573 /*
88 schoenebeck 973 The LSCP specification document input file (Documentation/lscp.xml) is
89     automatically updated with this file using the scripts/update_grammar.pl
90     script. Do not modify or delete the GRAMMAR_BNF_BEGIN and GRAMMAR_BNF_END
91     lines !
92 schoenebeck 573 */
93    
94     // GRAMMAR_BNF_BEGIN - do NOT delete or modify this line !!!
95    
96 senkov 170 input : line LF
97 schoenebeck 219 | line CR LF
98     ;
99 schoenebeck 35
100 senkov 170 line : /* epsilon (empty line ignored) */ { return LSCP_DONE; }
101     | comment { return LSCP_DONE; }
102     | command { LSCPSERVER->AnswerClient($1); return LSCP_DONE; }
103 schoenebeck 555 | error { LSCPSERVER->AnswerClient("ERR:0:Unknown command.\r\n"); RESTART; return LSCP_SYNTAX_ERROR; }
104 schoenebeck 35 ;
105    
106 schoenebeck 219 comment : '#'
107     | comment '#'
108 schoenebeck 111 | comment SP
109 schoenebeck 219 | comment number
110 schoenebeck 111 | comment string
111     ;
112    
113 schoenebeck 973 command : ADD SP add_instruction { $$ = $3; }
114 schoenebeck 947 | MAP SP map_instruction { $$ = $3; }
115     | UNMAP SP unmap_instruction { $$ = $3; }
116 schoenebeck 219 | GET SP get_instruction { $$ = $3; }
117     | CREATE SP create_instruction { $$ = $3; }
118     | DESTROY SP destroy_instruction { $$ = $3; }
119     | LIST SP list_instruction { $$ = $3; }
120     | LOAD SP load_instruction { $$ = $3; }
121 schoenebeck 947 | REMOVE SP remove_instruction { $$ = $3; }
122 schoenebeck 219 | SET SP set_instruction { $$ = $3; }
123     | SUBSCRIBE SP subscribe_event { $$ = $3; }
124     | UNSUBSCRIBE SP unsubscribe_event { $$ = $3; }
125 senkov 397 | SELECT SP text { $$ = LSCPSERVER->QueryDatabase($3); }
126 schoenebeck 947 | RESET SP reset_instruction { $$ = $3; }
127     | CLEAR SP clear_instruction { $$ = $3; }
128 schoenebeck 219 | RESET { $$ = LSCPSERVER->ResetSampler(); }
129     | QUIT { LSCPSERVER->AnswerClient("Bye!\r\n"); return LSCP_QUIT; }
130 schoenebeck 35 ;
131    
132 schoenebeck 973 add_instruction : CHANNEL { $$ = LSCPSERVER->AddChannel(); }
133     | MIDI_INSTRUMENT_MAP { $$ = LSCPSERVER->AddMidiInstrumentMap(); }
134     | MIDI_INSTRUMENT_MAP SP map_name { $$ = LSCPSERVER->AddMidiInstrumentMap($3); }
135     ;
136    
137 iliev 778 subscribe_event : CHANNEL_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channel_count); }
138     | VOICE_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_voice_count); }
139     | STREAM_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_stream_count); }
140     | BUFFER_FILL { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_buffer_fill); }
141     | CHANNEL_INFO { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_channel_info); }
142     | MISCELLANEOUS { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_misc); }
143     | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->SubscribeNotification(LSCPEvent::event_total_voice_count); }
144 senkov 135 ;
145    
146 iliev 778 unsubscribe_event : CHANNEL_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channel_count); }
147     | VOICE_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_voice_count); }
148     | STREAM_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_stream_count); }
149     | BUFFER_FILL { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_buffer_fill); }
150     | CHANNEL_INFO { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_channel_info); }
151     | MISCELLANEOUS { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_misc); }
152     | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->UnsubscribeNotification(LSCPEvent::event_total_voice_count); }
153 senkov 135 ;
154    
155 schoenebeck 973 map_instruction : MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,MidiInstrumentMapper::VOID,""); }
156     | MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP instr_load_mode { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,$17,""); }
157     | MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP entry_name { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,MidiInstrumentMapper::VOID,$17); }
158     | MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog SP engine_name SP filename SP instrument_index SP volume_value SP instr_load_mode SP entry_name { $$ = LSCPSERVER->AddOrReplaceMIDIInstrumentMapping($3,$5,$7,$9,$11,$13,$15,$17,$19); }
159 schoenebeck 947 ;
160    
161 schoenebeck 973 unmap_instruction : MIDI_INSTRUMENT SP midi_map SP midi_bank SP midi_prog { $$ = LSCPSERVER->RemoveMIDIInstrumentMapping($3,$5,$7); }
162 schoenebeck 947 ;
163    
164 schoenebeck 973 remove_instruction : CHANNEL SP sampler_channel { $$ = LSCPSERVER->RemoveChannel($3); }
165     | MIDI_INSTRUMENT_MAP SP midi_map { $$ = LSCPSERVER->RemoveMidiInstrumentMap($3); }
166     | MIDI_INSTRUMENT_MAP SP ALL { $$ = LSCPSERVER->RemoveAllMidiInstrumentMaps(); }
167 schoenebeck 947 ;
168    
169 schoenebeck 219 get_instruction : AVAILABLE_ENGINES { $$ = LSCPSERVER->GetAvailableEngines(); }
170     | AVAILABLE_MIDI_INPUT_DRIVERS { $$ = LSCPSERVER->GetAvailableMidiInputDrivers(); }
171     | MIDI_INPUT_DRIVER SP INFO SP string { $$ = LSCPSERVER->GetMidiInputDriverInfo($5); }
172     | MIDI_INPUT_DRIVER_PARAMETER SP INFO SP string SP string { $$ = LSCPSERVER->GetMidiInputDriverParameterInfo($5, $7); }
173     | MIDI_INPUT_DRIVER_PARAMETER SP INFO SP string SP string SP key_val_list { $$ = LSCPSERVER->GetMidiInputDriverParameterInfo($5, $7, $9); }
174     | AVAILABLE_AUDIO_OUTPUT_DRIVERS { $$ = LSCPSERVER->GetAvailableAudioOutputDrivers(); }
175     | AUDIO_OUTPUT_DRIVER SP INFO SP string { $$ = LSCPSERVER->GetAudioOutputDriverInfo($5); }
176     | AUDIO_OUTPUT_DRIVER_PARAMETER SP INFO SP string SP string { $$ = LSCPSERVER->GetAudioOutputDriverParameterInfo($5, $7); }
177     | AUDIO_OUTPUT_DRIVER_PARAMETER SP INFO SP string SP string SP key_val_list { $$ = LSCPSERVER->GetAudioOutputDriverParameterInfo($5, $7, $9); }
178     | AUDIO_OUTPUT_DEVICES { $$ = LSCPSERVER->GetAudioOutputDeviceCount(); }
179     | MIDI_INPUT_DEVICES { $$ = LSCPSERVER->GetMidiInputDeviceCount(); }
180     | AUDIO_OUTPUT_DEVICE SP INFO SP number { $$ = LSCPSERVER->GetAudioOutputDeviceInfo($5); }
181     | MIDI_INPUT_DEVICE SP INFO SP number { $$ = LSCPSERVER->GetMidiInputDeviceInfo($5); }
182     | MIDI_INPUT_PORT SP INFO SP number SP number { $$ = LSCPSERVER->GetMidiInputPortInfo($5, $7); }
183     | MIDI_INPUT_PORT_PARAMETER SP INFO SP number SP number SP string { $$ = LSCPSERVER->GetMidiInputPortParameterInfo($5, $7, $9); }
184     | AUDIO_OUTPUT_CHANNEL SP INFO SP number SP number { $$ = LSCPSERVER->GetAudioOutputChannelInfo($5, $7); }
185     | AUDIO_OUTPUT_CHANNEL_PARAMETER SP INFO SP number SP number SP string { $$ = LSCPSERVER->GetAudioOutputChannelParameterInfo($5, $7, $9); }
186     | CHANNELS { $$ = LSCPSERVER->GetChannels(); }
187     | CHANNEL SP INFO SP sampler_channel { $$ = LSCPSERVER->GetChannelInfo($5); }
188     | CHANNEL SP BUFFER_FILL SP buffer_size_type SP sampler_channel { $$ = LSCPSERVER->GetBufferFill($5, $7); }
189     | CHANNEL SP STREAM_COUNT SP sampler_channel { $$ = LSCPSERVER->GetStreamCount($5); }
190     | CHANNEL SP VOICE_COUNT SP sampler_channel { $$ = LSCPSERVER->GetVoiceCount($5); }
191     | ENGINE SP INFO SP engine_name { $$ = LSCPSERVER->GetEngineInfo($5); }
192 schoenebeck 563 | SERVER SP INFO { $$ = LSCPSERVER->GetServerInfo(); }
193 iliev 778 | TOTAL_VOICE_COUNT { $$ = LSCPSERVER->GetTotalVoiceCount(); }
194     | TOTAL_VOICE_COUNT_MAX { $$ = LSCPSERVER->GetTotalVoiceCountMax(); }
195 schoenebeck 973 | MIDI_INSTRUMENTS SP midi_map { $$ = LSCPSERVER->GetMidiInstrumentMappings($3); }
196     | MIDI_INSTRUMENTS SP ALL { $$ = LSCPSERVER->GetAllMidiInstrumentMappings(); }
197     | MIDI_INSTRUMENT SP INFO SP midi_map SP midi_bank SP midi_prog { $$ = LSCPSERVER->GetMidiInstrumentMapping($5,$7,$9); }
198     | MIDI_INSTRUMENT_MAPS { $$ = LSCPSERVER->GetMidiInstrumentMaps(); }
199     | MIDI_INSTRUMENT_MAP SP INFO SP midi_map { $$ = LSCPSERVER->GetMidiInstrumentMap($5); }
200 schoenebeck 35 ;
201    
202 schoenebeck 483 set_instruction : AUDIO_OUTPUT_DEVICE_PARAMETER SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetAudioOutputDeviceParameter($3, $5, $7); }
203     | AUDIO_OUTPUT_CHANNEL_PARAMETER SP number SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetAudioOutputChannelParameter($3, $5, $7, $9); }
204     | MIDI_INPUT_DEVICE_PARAMETER SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetMidiInputDeviceParameter($3, $5, $7); }
205     | MIDI_INPUT_PORT_PARAMETER SP number SP number SP string '=' param_val_list { $$ = LSCPSERVER->SetMidiInputPortParameter($3, $5, $7, $9); }
206     | CHANNEL SP set_chan_instruction { $$ = $3; }
207 schoenebeck 973 | MIDI_INSTRUMENT_MAP SP NAME SP midi_map SP map_name { $$ = LSCPSERVER->SetMidiInstrumentMapName($5, $7); }
208 schoenebeck 483 | ECHO SP boolean { $$ = LSCPSERVER->SetEcho((yyparse_param_t*) yyparse_param, $3); }
209 schoenebeck 123 ;
210    
211 schoenebeck 219 create_instruction : AUDIO_OUTPUT_DEVICE SP string SP key_val_list { $$ = LSCPSERVER->CreateAudioOutputDevice($3,$5); }
212     | AUDIO_OUTPUT_DEVICE SP string { $$ = LSCPSERVER->CreateAudioOutputDevice($3); }
213     | MIDI_INPUT_DEVICE SP string SP key_val_list { $$ = LSCPSERVER->CreateMidiInputDevice($3,$5); }
214     | MIDI_INPUT_DEVICE SP string { $$ = LSCPSERVER->CreateMidiInputDevice($3); }
215 schoenebeck 123 ;
216    
217 schoenebeck 947 reset_instruction : CHANNEL SP sampler_channel { $$ = LSCPSERVER->ResetChannel($3); }
218     ;
219    
220 schoenebeck 973 clear_instruction : MIDI_INSTRUMENTS SP midi_map { $$ = LSCPSERVER->ClearMidiInstrumentMappings($3); }
221     | MIDI_INSTRUMENTS SP ALL { $$ = LSCPSERVER->ClearAllMidiInstrumentMappings(); }
222 schoenebeck 947 ;
223    
224 schoenebeck 219 destroy_instruction : AUDIO_OUTPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyAudioOutputDevice($3); }
225     | MIDI_INPUT_DEVICE SP number { $$ = LSCPSERVER->DestroyMidiInputDevice($3); }
226 schoenebeck 123 ;
227    
228 schoenebeck 35 load_instruction : INSTRUMENT SP load_instr_args { $$ = $3; }
229     | ENGINE SP load_engine_args { $$ = $3; }
230     ;
231    
232 schoenebeck 219 set_chan_instruction : AUDIO_OUTPUT_DEVICE SP sampler_channel SP device_index { $$ = LSCPSERVER->SetAudioOutputDevice($5, $3); }
233     | AUDIO_OUTPUT_CHANNEL SP sampler_channel SP audio_channel_index SP audio_channel_index { $$ = LSCPSERVER->SetAudioOutputChannel($5, $7, $3); }
234     | AUDIO_OUTPUT_TYPE SP sampler_channel SP audio_output_type_name { $$ = LSCPSERVER->SetAudioOutputType($5, $3); }
235     | MIDI_INPUT SP sampler_channel SP device_index SP midi_input_port_index SP midi_input_channel_index { $$ = LSCPSERVER->SetMIDIInput($5, $7, $9, $3); }
236     | MIDI_INPUT_DEVICE SP sampler_channel SP device_index { $$ = LSCPSERVER->SetMIDIInputDevice($5, $3); }
237     | MIDI_INPUT_PORT SP sampler_channel SP midi_input_port_index { $$ = LSCPSERVER->SetMIDIInputPort($5, $3); }
238     | MIDI_INPUT_CHANNEL SP sampler_channel SP midi_input_channel_index { $$ = LSCPSERVER->SetMIDIInputChannel($5, $3); }
239     | MIDI_INPUT_TYPE SP sampler_channel SP midi_input_type_name { $$ = LSCPSERVER->SetMIDIInputType($5, $3); }
240     | VOLUME SP sampler_channel SP volume_value { $$ = LSCPSERVER->SetVolume($5, $3); }
241 schoenebeck 705 | MUTE SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelMute($5, $3); }
242     | SOLO SP sampler_channel SP boolean { $$ = LSCPSERVER->SetChannelSolo($5, $3); }
243 schoenebeck 973 | MIDI_INSTRUMENT_MAP SP sampler_channel SP midi_map { $$ = LSCPSERVER->SetChannelMap($3, $5); }
244     | MIDI_INSTRUMENT_MAP SP sampler_channel SP NONE { $$ = LSCPSERVER->SetChannelMap($3, -1); }
245     | MIDI_INSTRUMENT_MAP SP sampler_channel SP DEFAULT { $$ = LSCPSERVER->SetChannelMap($3, -2); }
246 schoenebeck 35 ;
247    
248 schoenebeck 483 key_val_list : string '=' param_val_list { $$[$1] = $3; }
249     | key_val_list SP string '=' param_val_list { $$ = $1; $$[$3] = $5; }
250 senkov 135 ;
251 schoenebeck 123
252 schoenebeck 35 buffer_size_type : BYTES { $$ = fill_response_bytes; }
253     | PERCENTAGE { $$ = fill_response_percentage; }
254     ;
255    
256 capela 527 list_instruction : AUDIO_OUTPUT_DEVICES { $$ = LSCPSERVER->GetAudioOutputDevices(); }
257     | MIDI_INPUT_DEVICES { $$ = LSCPSERVER->GetMidiInputDevices(); }
258     | CHANNELS { $$ = LSCPSERVER->ListChannels(); }
259     | AVAILABLE_ENGINES { $$ = LSCPSERVER->ListAvailableEngines(); }
260     | AVAILABLE_MIDI_INPUT_DRIVERS { $$ = LSCPSERVER->ListAvailableMidiInputDrivers(); }
261     | AVAILABLE_AUDIO_OUTPUT_DRIVERS { $$ = LSCPSERVER->ListAvailableAudioOutputDrivers(); }
262 schoenebeck 973 | MIDI_INSTRUMENTS SP midi_map { $$ = LSCPSERVER->ListMidiInstrumentMappings($3); }
263     | MIDI_INSTRUMENTS SP ALL { $$ = LSCPSERVER->ListAllMidiInstrumentMappings(); }
264     | MIDI_INSTRUMENT_MAPS { $$ = LSCPSERVER->ListMidiInstrumentMaps(); }
265 schoenebeck 123 ;
266    
267 schoenebeck 219 load_instr_args : filename SP instrument_index SP sampler_channel { $$ = LSCPSERVER->LoadInstrument($1, $3, $5); }
268     | NON_MODAL SP filename SP instrument_index SP sampler_channel { $$ = LSCPSERVER->LoadInstrument($3, $5, $7, true); }
269 schoenebeck 35 ;
270    
271 schoenebeck 411 load_engine_args : engine_name SP sampler_channel { $$ = LSCPSERVER->SetEngineType($1, $3); }
272 schoenebeck 35 ;
273    
274 schoenebeck 947 instr_load_mode : ON_DEMAND { $$ = MidiInstrumentMapper::ON_DEMAND; }
275     | ON_DEMAND_HOLD { $$ = MidiInstrumentMapper::ON_DEMAND_HOLD; }
276     | PERSISTENT { $$ = MidiInstrumentMapper::PERSISTENT; }
277     ;
278    
279 schoenebeck 219 device_index : number
280     ;
281    
282     audio_channel_index : number
283     ;
284    
285     audio_output_type_name : string
286     ;
287    
288     midi_input_port_index : number
289     ;
290    
291     midi_input_channel_index : number
292 schoenebeck 274 | ALL { $$ = 16; }
293 schoenebeck 219 ;
294    
295     midi_input_type_name : string
296     ;
297    
298 schoenebeck 973 midi_map : number
299 schoenebeck 947 ;
300    
301 schoenebeck 973 midi_bank : number
302 schoenebeck 947 ;
303    
304     midi_prog : number
305     ;
306    
307 schoenebeck 219 volume_value : dotnum
308     | number { $$ = $1; }
309     ;
310    
311     sampler_channel : number
312     ;
313    
314     instrument_index : number
315     ;
316    
317     engine_name : string
318     ;
319    
320     filename : stringval
321     ;
322    
323 schoenebeck 973 map_name : stringval
324     ;
325    
326 schoenebeck 947 entry_name : stringval
327     ;
328    
329 schoenebeck 483 param_val_list : param_val
330     | param_val_list','param_val { $$ = $1 + "," + $3; }
331     ;
332    
333 schoenebeck 219 param_val : string
334 schoenebeck 826 | stringval
335 schoenebeck 483 | number { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); }
336     | dotnum { std::stringstream ss; ss << "\'" << $1 << "\'"; $$ = ss.str(); }
337 schoenebeck 219 ;
338    
339 schoenebeck 573 // GRAMMAR_BNF_END - do NOT delete or modify this line !!!
340 schoenebeck 219
341 schoenebeck 573
342 schoenebeck 219 // atomic variable symbol rules
343    
344     boolean : number { $$ = $1; }
345     | string { $$ = -1; }
346 capela 159 ;
347    
348 schoenebeck 219 string : char { std::string s; s = $1; $$ = s; }
349     | string char { $$ = $1 + $2; }
350 capela 159 ;
351    
352 schoenebeck 225 dotnum : digits '.' digits { $$ = atof(String($1 + "." + $3).c_str()); }
353 schoenebeck 219 | '+' digits '.' digits { String s = "+"; s += $2; s += "."; s += $4; $$ = atof(s.c_str()); }
354     | '-' digits '.' digits { $$ = atof(String("-" + $2 + "." + $4).c_str()); }
355 capela 143 ;
356    
357 schoenebeck 219
358     digits : digit { $$ = $1; }
359     | digits digit { $$ = $1 + $2; }
360 senkov 155 ;
361    
362 schoenebeck 219 digit : '0' { $$ = '0'; }
363     | '1' { $$ = '1'; }
364     | '2' { $$ = '2'; }
365     | '3' { $$ = '3'; }
366     | '4' { $$ = '4'; }
367     | '5' { $$ = '5'; }
368     | '6' { $$ = '6'; }
369     | '7' { $$ = '7'; }
370     | '8' { $$ = '8'; }
371     | '9' { $$ = '9'; }
372 senkov 155 ;
373    
374 schoenebeck 219 number : digit { $$ = atoi(String(1, $1).c_str()); }
375     | '1' digits { $$ = atoi(String(String("1") + $2).c_str()); }
376     | '2' digits { $$ = atoi(String(String("2") + $2).c_str()); }
377     | '3' digits { $$ = atoi(String(String("3") + $2).c_str()); }
378     | '4' digits { $$ = atoi(String(String("4") + $2).c_str()); }
379     | '5' digits { $$ = atoi(String(String("5") + $2).c_str()); }
380     | '6' digits { $$ = atoi(String(String("6") + $2).c_str()); }
381     | '7' digits { $$ = atoi(String(String("7") + $2).c_str()); }
382     | '8' digits { $$ = atoi(String(String("8") + $2).c_str()); }
383     | '9' digits { $$ = atoi(String(String("9") + $2).c_str()); }
384    
385     char : 'A' { $$ = 'A'; } | 'B' { $$ = 'B'; } | 'C' { $$ = 'C'; } | 'D' { $$ = 'D'; } | 'E' { $$ = 'E'; } | 'F' { $$ = 'F'; } | 'G' { $$ = 'G'; } | 'H' { $$ = 'H'; } | 'I' { $$ = 'I'; } | 'J' { $$ = 'J'; } | 'K' { $$ = 'K'; } | 'L' { $$ = 'L'; } | 'M' { $$ = 'M'; } | 'N' { $$ = 'N'; } | 'O' { $$ = 'O'; } | 'P' { $$ = 'P'; } | 'Q' { $$ = 'Q'; } | 'R' { $$ = 'R'; } | 'S' { $$ = 'S'; } | 'T' { $$ = 'T'; } | 'U' { $$ = 'U'; } | 'V' { $$ = 'V'; } | 'W' { $$ = 'W'; } | 'X' { $$ = 'X'; } | 'Y' { $$ = 'Y'; } | 'Z' { $$ = 'Z'; }
386     | 'a' { $$ = 'a'; } | 'b' { $$ = 'b'; } | 'c' { $$ = 'c'; } | 'd' { $$ = 'd'; } | 'e' { $$ = 'e'; } | 'f' { $$ = 'f'; } | 'g' { $$ = 'g'; } | 'h' { $$ = 'h'; } | 'i' { $$ = 'i'; } | 'j' { $$ = 'j'; } | 'k' { $$ = 'k'; } | 'l' { $$ = 'l'; } | 'm' { $$ = 'm'; } | 'n' { $$ = 'n'; } | 'o' { $$ = 'o'; } | 'p' { $$ = 'p'; } | 'q' { $$ = 'q'; } | 'r' { $$ = 'r'; } | 's' { $$ = 's'; } | 't' { $$ = 't'; } | 'u' { $$ = 'u'; } | 'v' { $$ = 'v'; } | 'w' { $$ = 'w'; } | 'x' { $$ = 'x'; } | 'y' { $$ = 'y'; } | 'z' { $$ = 'z'; }
387     | '0' { $$ = '0'; } | '1' { $$ = '1'; } | '2' { $$ = '2'; } | '3' { $$ = '3'; } | '4' { $$ = '4'; } | '5' { $$ = '5'; } | '6' { $$ = '6'; } | '7' { $$ = '7'; } | '8' { $$ = '8'; } | '9' { $$ = '9'; }
388 schoenebeck 226 | '!' { $$ = '!'; } | '#' { $$ = '#'; } | '$' { $$ = '$'; } | '%' { $$ = '%'; } | '&' { $$ = '&'; } | '(' { $$ = '('; } | ')' { $$ = ')'; } | '*' { $$ = '*'; } | '+' { $$ = '+'; } | '-' { $$ = '-'; } | '.' { $$ = '.'; } | ',' { $$ = ','; } | '/' { $$ = '/'; }
389 schoenebeck 219 | ':' { $$ = ':'; } | ';' { $$ = ';'; } | '<' { $$ = '<'; } | '=' { $$ = '='; } | '>' { $$ = '>'; } | '?' { $$ = '?'; } | '@' { $$ = '@'; }
390     | '[' { $$ = '['; } | '\\' { $$ = '\\'; } | ']' { $$ = ']'; } | '^' { $$ = '^'; } | '_' { $$ = '_'; }
391     | '{' { $$ = '{'; } | '|' { $$ = '|'; } | '}' { $$ = '}'; } | '~' { $$ = '~'; }
392     | '\200' { $$ = '\200'; } | '\201' { $$ = '\201'; } | '\202' { $$ = '\202'; }
393     | '\203' { $$ = '\203'; } | '\204' { $$ = '\204'; } | '\205' { $$ = '\205'; }
394     | '\206' { $$ = '\206'; } | '\207' { $$ = '\207'; } | '\210' { $$ = '\210'; }
395     | '\211' { $$ = '\211'; } | '\212' { $$ = '\212'; } | '\213' { $$ = '\213'; }
396     | '\214' { $$ = '\214'; } | '\215' { $$ = '\215'; } | '\216' { $$ = '\216'; }
397     | '\217' { $$ = '\217'; } | '\220' { $$ = '\220'; } | '\221' { $$ = '\221'; }
398     | '\222' { $$ = '\222'; } | '\223' { $$ = '\223'; } | '\224' { $$ = '\224'; }
399     | '\225' { $$ = '\225'; } | '\226' { $$ = '\226'; } | '\227' { $$ = '\227'; }
400     | '\230' { $$ = '\230'; } | '\231' { $$ = '\231'; } | '\232' { $$ = '\232'; }
401     | '\233' { $$ = '\233'; } | '\234' { $$ = '\234'; } | '\235' { $$ = '\235'; }
402     | '\236' { $$ = '\236'; } | '\237' { $$ = '\237'; } | '\240' { $$ = '\240'; }
403     | '\241' { $$ = '\241'; } | '\242' { $$ = '\242'; } | '\243' { $$ = '\243'; }
404     | '\244' { $$ = '\244'; } | '\245' { $$ = '\245'; } | '\246' { $$ = '\246'; }
405     | '\247' { $$ = '\247'; } | '\250' { $$ = '\250'; } | '\251' { $$ = '\251'; }
406     | '\252' { $$ = '\252'; } | '\253' { $$ = '\253'; } | '\254' { $$ = '\254'; }
407     | '\255' { $$ = '\255'; } | '\256' { $$ = '\256'; } | '\257' { $$ = '\257'; }
408     | '\260' { $$ = '\260'; } | '\261' { $$ = '\261'; } | '\262' { $$ = '\262'; }
409     | '\263' { $$ = '\263'; } | '\264' { $$ = '\264'; } | '\265' { $$ = '\265'; }
410     | '\266' { $$ = '\266'; } | '\267' { $$ = '\267'; } | '\270' { $$ = '\270'; }
411     | '\271' { $$ = '\271'; } | '\272' { $$ = '\272'; } | '\273' { $$ = '\273'; }
412     | '\274' { $$ = '\274'; } | '\275' { $$ = '\275'; } | '\276' { $$ = '\276'; }
413     | '\277' { $$ = '\277'; } | '\300' { $$ = '\300'; } | '\301' { $$ = '\301'; }
414     | '\302' { $$ = '\302'; } | '\303' { $$ = '\303'; } | '\304' { $$ = '\304'; }
415     | '\305' { $$ = '\305'; } | '\306' { $$ = '\306'; } | '\307' { $$ = '\307'; }
416     | '\310' { $$ = '\310'; } | '\311' { $$ = '\311'; } | '\312' { $$ = '\312'; }
417     | '\313' { $$ = '\313'; } | '\314' { $$ = '\314'; } | '\315' { $$ = '\315'; }
418     | '\316' { $$ = '\316'; } | '\317' { $$ = '\317'; } | '\320' { $$ = '\320'; }
419     | '\321' { $$ = '\321'; } | '\322' { $$ = '\322'; } | '\323' { $$ = '\323'; }
420     | '\324' { $$ = '\324'; } | '\325' { $$ = '\325'; } | '\326' { $$ = '\326'; }
421     | '\327' { $$ = '\327'; } | '\330' { $$ = '\330'; } | '\331' { $$ = '\331'; }
422     | '\332' { $$ = '\332'; } | '\333' { $$ = '\333'; } | '\334' { $$ = '\334'; }
423     | '\335' { $$ = '\335'; } | '\336' { $$ = '\336'; } | '\337' { $$ = '\337'; }
424     | '\340' { $$ = '\340'; } | '\341' { $$ = '\341'; } | '\342' { $$ = '\342'; }
425     | '\343' { $$ = '\343'; } | '\344' { $$ = '\344'; } | '\345' { $$ = '\345'; }
426     | '\346' { $$ = '\346'; } | '\347' { $$ = '\347'; } | '\350' { $$ = '\350'; }
427     | '\351' { $$ = '\351'; } | '\352' { $$ = '\352'; } | '\353' { $$ = '\353'; }
428     | '\354' { $$ = '\354'; } | '\355' { $$ = '\355'; } | '\356' { $$ = '\356'; }
429     | '\357' { $$ = '\357'; } | '\360' { $$ = '\360'; } | '\361' { $$ = '\361'; }
430     | '\362' { $$ = '\362'; } | '\363' { $$ = '\363'; } | '\364' { $$ = '\364'; }
431     | '\365' { $$ = '\365'; } | '\366' { $$ = '\366'; } | '\367' { $$ = '\367'; }
432     | '\370' { $$ = '\370'; } | '\371' { $$ = '\371'; } | '\372' { $$ = '\372'; }
433     | '\373' { $$ = '\373'; } | '\374' { $$ = '\374'; } | '\375' { $$ = '\375'; }
434     | '\376' { $$ = '\376'; } | '\377' { $$ = '\377'; }
435 senkov 155 ;
436    
437 schoenebeck 221 text : SP { $$ = " "; }
438     | string
439     | text SP { $$ = $1 + " "; }
440     | text string { $$ = $1 + $2; }
441 schoenebeck 35 ;
442    
443 schoenebeck 225 stringval : '\'' text '\'' { $$ = $2; }
444     | '\"' text '\"' { $$ = $2; }
445 schoenebeck 221 ;
446 schoenebeck 219
447 schoenebeck 221
448 schoenebeck 219 // rules which are more or less just terminal symbols
449    
450     SP : ' '
451 schoenebeck 35 ;
452    
453 schoenebeck 219 LF : '\n'
454 schoenebeck 35 ;
455    
456 schoenebeck 219 CR : '\r'
457 schoenebeck 35 ;
458    
459 schoenebeck 219 ADD : 'A''D''D'
460 schoenebeck 35 ;
461    
462 schoenebeck 219 GET : 'G''E''T'
463 schoenebeck 35 ;
464    
465 schoenebeck 947 MAP : 'M''A''P'
466     ;
467    
468     UNMAP : 'U''N''M''A''P'
469     ;
470    
471     CLEAR : 'C''L''E''A''R'
472     ;
473    
474 schoenebeck 219 CREATE : 'C''R''E''A''T''E'
475 schoenebeck 35 ;
476    
477 schoenebeck 219 DESTROY : 'D''E''S''T''R''O''Y'
478 schoenebeck 210 ;
479    
480 schoenebeck 219 LIST : 'L''I''S''T'
481 schoenebeck 35 ;
482    
483 schoenebeck 219 LOAD : 'L''O''A''D'
484     ;
485    
486 schoenebeck 228 ALL : 'A''L''L'
487     ;
488    
489 schoenebeck 973 NONE : 'N''O''N''E'
490     ;
491    
492     DEFAULT : 'D''E''F''A''U''L''T'
493     ;
494    
495 schoenebeck 219 NON_MODAL : 'N''O''N''_''M''O''D''A''L'
496     ;
497    
498     REMOVE : 'R''E''M''O''V''E'
499     ;
500    
501     SET : 'S''E''T'
502     ;
503    
504     SUBSCRIBE : 'S''U''B''S''C''R''I''B''E'
505     ;
506    
507     UNSUBSCRIBE : 'U''N''S''U''B''S''C''R''I''B''E'
508     ;
509    
510 senkov 397 SELECT : 'S''E''L''E''C''T'
511     ;
512    
513 schoenebeck 219 CHANNEL : 'C''H''A''N''N''E''L'
514     ;
515    
516     AVAILABLE_ENGINES : 'A''V''A''I''L''A''B''L''E''_''E''N''G''I''N''E''S'
517     ;
518    
519     AVAILABLE_AUDIO_OUTPUT_DRIVERS : 'A''V''A''I''L''A''B''L''E''_''A''U''D''I''O''_''O''U''T''P''U''T''_''D''R''I''V''E''R''S'
520     ;
521    
522     CHANNELS : 'C''H''A''N''N''E''L''S'
523     ;
524    
525     INFO : 'I''N''F''O'
526     ;
527    
528 schoenebeck 556 CHANNEL_COUNT : 'C''H''A''N''N''E''L''_''C''O''U''N''T'
529     ;
530    
531     CHANNEL_INFO : 'C''H''A''N''N''E''L''_''I''N''F''O'
532     ;
533    
534 schoenebeck 219 BUFFER_FILL : 'B''U''F''F''E''R''_''F''I''L''L'
535     ;
536    
537     STREAM_COUNT : 'S''T''R''E''A''M''_''C''O''U''N''T'
538     ;
539    
540     VOICE_COUNT : 'V''O''I''C''E''_''C''O''U''N''T'
541     ;
542    
543 iliev 778 TOTAL_VOICE_COUNT : 'T''O''T''A''L''_''V''O''I''C''E''_''C''O''U''N''T'
544     ;
545    
546     TOTAL_VOICE_COUNT_MAX: 'T''O''T''A''L''_''V''O''I''C''E''_''C''O''U''N''T''_''M''A''X'
547     ;
548    
549 schoenebeck 219 INSTRUMENT : 'I''N''S''T''R''U''M''E''N''T'
550     ;
551    
552     ENGINE : 'E' 'N' 'G' 'I' 'N' 'E'
553     ;
554    
555 schoenebeck 947 ON_DEMAND : 'O''N''_''D''E''M''A''N''D'
556     ;
557    
558     ON_DEMAND_HOLD : 'O''N''_''D''E''M''A''N''D''_''H''O''L''D'
559     ;
560    
561     PERSISTENT : 'P''E''R''S''I''S''T''E''N''T'
562     ;
563    
564 schoenebeck 219 AUDIO_OUTPUT_DEVICE_PARAMETER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E''_''P''A''R''A''M''E''T''E''R'
565     ;
566    
567     AUDIO_OUTPUT_DEVICES : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E''S'
568     ;
569    
570     AUDIO_OUTPUT_DEVICE : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''E''V''I''C''E'
571     ;
572    
573     AUDIO_OUTPUT_DRIVER_PARAMETER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''R''I''V''E''R''_''P''A''R''A''M''E''T''E''R'
574     ;
575    
576     AUDIO_OUTPUT_DRIVER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''D''R''I''V''E''R'
577     ;
578    
579     AUDIO_OUTPUT_CHANNEL_PARAMETER : 'A''U''D''I''O''_''O''U''T''P''U''T''_''C''H''A''N''N''E''L''_''P''A''R''A''M''E''T''E''R'
580     ;
581    
582     AUDIO_OUTPUT_CHANNEL : 'A''U''D''I''O''_''O''U''T''P''U''T''_''C''H''A''N''N''E''L'
583     ;
584    
585     AUDIO_OUTPUT_TYPE : 'A''U''D''I''O''_''O''U''T''P''U''T''_''T''Y''P''E'
586     ;
587    
588     AVAILABLE_MIDI_INPUT_DRIVERS : 'A''V''A''I''L''A''B''L''E''_''M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R''S'
589     ;
590    
591     MIDI_INPUT_DEVICE_PARAMETER : 'M''I''D''I''_''I''N''P''U''T''_''D''E''V''I''C''E''_''P''A''R''A''M''E''T''E''R'
592     ;
593    
594     MIDI_INPUT_PORT_PARAMETER : 'M''I''D''I''_''I''N''P''U''T''_''P''O''R''T''_''P''A''R''A''M''E''T''E''R'
595     ;
596    
597     MIDI_INPUT_DEVICES : 'M''I''D''I''_''I''N''P''U''T''_''D''E''V''I''C''E''S'
598     ;
599    
600     MIDI_INPUT_DEVICE : 'M''I''D''I''_''I''N''P''U''T''_''D''E''V''I''C''E'
601     ;
602    
603     MIDI_INPUT_DRIVER_PARAMETER : 'M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R''_''P''A''R''A''M''E''T''E''R'
604     ;
605    
606 schoenebeck 947 MIDI_INSTRUMENT : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T'
607     ;
608    
609     MIDI_INSTRUMENTS : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T''S'
610     ;
611    
612 schoenebeck 973 MIDI_INSTRUMENT_MAP : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T''_''M''A''P'
613     ;
614    
615     MIDI_INSTRUMENT_MAPS : 'M''I''D''I''_''I''N''S''T''R''U''M''E''N''T''_''M''A''P''S'
616     ;
617    
618 schoenebeck 219 MIDI_INPUT_DRIVER : 'M''I''D''I''_''I''N''P''U''T''_''D''R''I''V''E''R'
619     ;
620    
621     MIDI_INPUT_PORT : 'M''I''D''I''_''I''N''P''U''T''_''P''O''R''T'
622     ;
623    
624     MIDI_INPUT_CHANNEL : 'M''I''D''I''_''I''N''P''U''T''_''C''H''A''N''N''E''L'
625     ;
626    
627     MIDI_INPUT_TYPE : 'M''I''D''I''_''I''N''P''U''T''_''T''Y''P''E'
628     ;
629    
630     MIDI_INPUT : 'M''I''D''I''_''I''N''P''U''T'
631     ;
632    
633 schoenebeck 563 SERVER : 'S''E''R''V''E''R'
634     ;
635    
636 schoenebeck 219 VOLUME : 'V''O''L''U''M''E'
637     ;
638    
639 schoenebeck 705 MUTE : 'M''U''T''E'
640     ;
641    
642     SOLO : 'S''O''L''O'
643     ;
644    
645 schoenebeck 219 BYTES : 'B''Y''T''E''S'
646     ;
647    
648     PERCENTAGE : 'P''E''R''C''E''N''T''A''G''E'
649     ;
650    
651     RESET : 'R''E''S''E''T'
652     ;
653    
654     MISCELLANEOUS : 'M''I''S''C''E''L''L''A''N''E''O''U''S'
655     ;
656    
657 schoenebeck 973 NAME : 'N''A''M''E'
658     ;
659    
660 schoenebeck 219 ECHO : 'E''C''H''O'
661     ;
662    
663     QUIT : 'Q''U''I''T'
664     ;
665    
666 schoenebeck 35 %%
667    
668     /**
669     * Will be called when an error occured (usually syntax error).
670     */
671     void yyerror(const char* s) {
672     dmsg(2,("LSCPParser: %s\n", s));
673     }
674    
675     /**
676 schoenebeck 219 * Clears input buffer.
677 schoenebeck 35 */
678     void restart(yyparse_param_t* pparam, int& yychar) {
679 schoenebeck 219 bytes = 0;
680     ptr = 0;
681 schoenebeck 35 }

  ViewVC Help
Powered by ViewVC