00001
00031
00032
00033
00034
00035
00036 #include "Global.h"
00037 #include "Interpre.h"
00038 #include "GrafKern.h"
00039
00040 #include <math.h>
00041
00042
00043
00044
00045 struct harmonie_ereignis * first_harmonie[MAX_BOX];
00046
00047 struct harmonie_ereignis ** last_global_harmonie[MAX_BOX];
00048
00049 struct harmonie_ereignis ** first_lokal_harmonie;
00050
00051 struct keyboard_ereignis * first_keyboard[MAX_BOX];
00052
00053 struct keyboard_ereignis ** last_global_keyboard[MAX_BOX];
00054
00055 struct keyboard_ereignis ** first_lokal_keyboard;
00056
00057 struct midi_ereignis * first_midi[MAX_BOX];
00058
00059 struct midi_ereignis ** last_global_midi[MAX_BOX];
00060
00061 struct midi_ereignis ** first_lokal_midi;
00062
00063 long anzahl_eingelesene_zeichen;
00064
00065
00066
00067
00068
00069
00070 static struct do_aktion * expandiere_name (
00071 const char * name,
00072
00073 struct argument_liste * parameter,
00074
00075 struct interpreter_parameter_liste * bezugs_liste);
00076
00077 static struct do_aktion * expandiere_umstimmung (
00078
00079 struct umstimmung * the_umstimmung,
00080
00081 struct interpreter_parameter_liste * aktuelle_parameter);
00082
00083 static struct do_aktion * expandiere_midi (struct midiliste * liste);
00084
00085
00086
00087
00088
00089
00090 double get_komplex_faktor (struct komplex_intervall * lauf)
00091 {
00092 double ret = 1.0;
00093
00094 for ( ; lauf ; lauf = lauf -> next )
00095 {
00096
00097 struct intervall * help = get_intervall (lauf->name, list_of_intervalle);
00098
00099 if (help && help -> intervall_typ == intervall_absolut) {
00100 ret *= pow (help -> u.intervall_absolut.intervall_wert,
00101 lauf->faktor);
00102 } else {
00103 fatal_error (0, __FILE__, __LINE__);
00104 }
00105
00106 }
00107
00108 return ret;
00109 }
00110
00111
00112 double get_komplex_frequenz (struct ton * dieser)
00113
00114 {
00115 double ret = get_ton (dieser->u.ton_komplex.bezugston, list_of_toene)
00116 -> u.ton_absolut.ton_wert;
00117 ret *= get_komplex_faktor (dieser->u.ton_komplex.komplex_liste);
00118 return ret;
00119 }
00120
00121
00122 void fprint_argument (FILE * zieldatei, struct argument * argument)
00123 {
00124 if (argument -> argument_typ == zahl)
00125 {
00126 fprintf (zieldatei, ", %d ", argument -> u.zahl.zahl);
00127 } else if (argument -> argument_typ == parameter)
00128 {
00129 fprintf (zieldatei, ", %s ", argument -> u.parameter.parameter_name);
00130 } else
00131 fatal_error (0, __FILE__, __LINE__ );
00132 }
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 static struct interpreter_parameter_liste zentrums_knoten =
00158 {
00159 & laufzeit_zentrum, NULL
00160 };
00161
00162 static struct interpreter_parameter_liste abstands_knoten =
00163 {
00164 & laufzeit_abstand, & zentrums_knoten
00165 };
00166
00167 struct interpreter_parameter_liste * start_parameter_liste =
00168 & abstands_knoten;
00169
00170
00171
00172
00173
00174
00175
00176 struct cache_konstanten
00177 {
00178 int konstante [MAX_BOX];
00179
00180 struct cache_konstanten * next;
00181 };
00182
00183 static struct cache_konstanten * cache_konstanten = NULL;
00184
00185 static int (* get_cache_konstante (int wert) ) [MAX_BOX]
00186 {
00187
00188 struct cache_konstanten ** lauf;
00189 int i;
00190
00191 for (lauf = & cache_konstanten; *lauf; lauf = & (*lauf)->next) {
00192 if ((*lauf)->konstante[0] == wert)
00193 return & (*lauf)->konstante;
00194 }
00195
00196 *lauf = (struct cache_konstanten*) xmalloc (sizeof (struct cache_konstanten));
00197
00198 for (i=0; i<MAX_BOX; i++)
00199 (*lauf)->konstante[i] = wert;
00200
00201 (*lauf)->next = NULL;
00202
00203 return & (*lauf)->konstante;
00204 }
00205
00206 static struct interpreter_parameter_liste * gen_parameter_liste (
00207
00208 struct argument_liste * liste,
00209
00210 struct interpreter_parameter_liste * bezugs_liste)
00211 {
00212
00213 struct interpreter_parameter_liste * help;
00214
00215 if (liste == NULL)
00216 return NULL;
00217
00218 help = (interpreter_parameter_liste*) xmalloc (sizeof (struct interpreter_parameter_liste));
00219
00220 switch (liste->argument.argument_typ)
00221 {
00222
00223 case zahl:
00224 help->werte_feld = get_cache_konstante (liste->argument.u.zahl.zahl);
00225
00226 break;
00227
00228 case parameter: {
00229 int i;
00230
00231 struct interpreter_parameter_liste * lauf;
00232
00233 for (lauf = bezugs_liste, i=liste->argument.u.parameter.parameter_nummer;
00234 lauf && i;
00235 lauf = lauf -> next, i--)
00236 ;
00237
00238 if (lauf)
00239 help->werte_feld = lauf -> werte_feld;
00240 else
00241 fatal_error (0, __FILE__, __LINE__);
00242 }
00243
00244 break;
00245
00246 default:
00247 fatal_error (0, __FILE__, __LINE__);
00248
00249 break;
00250 }
00251
00252 help->next = gen_parameter_liste (liste->next, bezugs_liste);
00253
00254 return help;
00255 }
00256
00257 static int * get_wert_of_argument (
00258
00259 struct argument * argument,
00260
00261 struct interpreter_parameter_liste * aktuelle_parameter
00262 )
00263 {
00264 switch (argument->argument_typ)
00265 {
00266
00267 case zahl:
00268 return * get_cache_konstante (argument->u.zahl.zahl);
00269
00270
00271
00272 case parameter: {
00273
00274 struct interpreter_parameter_liste * lauf;
00275 int i;
00276
00277 for (lauf=aktuelle_parameter, i=argument->u.parameter.parameter_nummer;
00278 lauf && i;
00279 lauf = lauf -> next, i--)
00280 ;
00281
00282 if (lauf)
00283 return * lauf->werte_feld;
00284 else {
00285 fatal_error (0, __FILE__, __LINE__);
00286 return NULL;
00287 }
00288 }
00289
00290
00291
00292 default:
00293 fatal_error (0, __FILE__, __LINE__);
00294
00295 return NULL;
00296
00297
00298 }
00299
00300 }
00301
00302
00303 static struct ton_einstell * expand_tonliste (struct ton * the_tonliste)
00304 {
00305
00306 struct ton_einstell * help;
00307
00308 if (the_tonliste == NULL) return NULL;
00309
00310 help = (ton_einstell*) xmalloc (sizeof (struct ton_einstell));
00311
00312 switch (the_tonliste -> ton_typ)
00313 {
00314
00315 default:
00316 fatal_error (0, __FILE__, __LINE__);
00317
00318 case ton_absolut:
00319 if (the_tonliste->name) {
00320 help -> ton_einstell_typ = einstell_absolut;
00321 help -> u.einstell_absolut.wert =
00322 DOUBLE_TO_LONG (
00323 FREQUENZ_TO_MIDI(
00324 the_tonliste->u.ton_absolut.ton_wert));
00325 } else {
00326 help -> ton_einstell_typ = einstell_stumm;
00327 }
00328
00329 break;
00330
00331 case ton_komplex:
00332 if (the_tonliste->name == NULL) {
00333 help -> ton_einstell_typ = einstell_stumm;
00334 } else
00335 if ( ! strcmp (the_tonliste->name, "@")) {
00336 if (the_tonliste->u.ton_komplex.komplex_liste) {
00337 help -> ton_einstell_typ = einstell_relativ;
00338 help -> u.einstell_relativ.wert =
00339 DOUBLE_TO_LONG (
00340 FAKTOR_TO_MIDI (
00341 get_komplex_faktor (the_tonliste->u.ton_komplex.komplex_liste)));
00342 } else {
00343 help -> ton_einstell_typ = einstell_gleich;
00344 }
00345 } else {
00346 help -> ton_einstell_typ = einstell_absolut;
00347 help -> u.einstell_absolut.wert =
00348 DOUBLE_TO_LONG (
00349 FREQUENZ_TO_MIDI (
00350 get_komplex_frequenz (the_tonliste)));
00351
00352 }
00353
00354 break;
00355 }
00356
00357 help -> next = expand_tonliste (the_tonliste -> next);
00358
00359 return help;
00360
00361
00362 }
00363
00364
00365 static struct do_aktion * expandiere_tonsystem (
00366
00367 struct tonsystem * the_tonsystem)
00368 {
00369
00370 struct do_aktion * help;
00371 tone_system * help_tonsystem;
00372
00373 help = (do_aktion*) xmalloc (sizeof (struct do_aktion));
00374 help -> name = the_tonsystem -> name;
00375 help -> aufruf_typ = aufruf_tonsystem;
00376
00377 help_tonsystem = (TSYS*) xmalloc (sizeof (tone_system));
00378 help_tonsystem -> anker = the_tonsystem -> taste;
00379 help_tonsystem -> breite = ton_list_laenge (the_tonsystem -> toene);
00380 help_tonsystem -> periode =
00381 DOUBLE_TO_LONG (
00382 FAKTOR_TO_MIDI (
00383 get_wert_komplex_intervall (
00384 the_tonsystem -> periode)));
00385
00386 {
00387
00388 struct ton * ton_lauf;
00389 int i;
00390
00391 for (ton_lauf = the_tonsystem -> toene , i = 0 ;
00392 ton_lauf;
00393 ton_lauf = ton_lauf -> next , i++ ) {
00394 if (ton_lauf->name) {
00395 help_tonsystem->ton[i] =
00396 DOUBLE_TO_LONG( FREQUENZ_TO_MIDI(
00397 get_ton (
00398 ton_lauf -> name, list_of_toene)
00399 -> u.ton_absolut.ton_wert));
00400 } else {
00401 help_tonsystem->ton[i] = 0 ;
00402 }
00403 }
00404 }
00405
00406 help -> u.aufruf_tonsystem.tonsystem = help_tonsystem;
00407 help -> next = NULL;
00408
00409 return help;
00410 }
00411
00412
00413 static struct do_aktion * expandiere_logik (
00414
00415 struct logik * the_logik)
00416 {
00417
00418 struct do_aktion * help;
00419 int i;
00420
00421 help = (do_aktion*) xmalloc (sizeof (struct do_aktion));
00422 help -> name = the_logik -> name;
00423 help -> aufruf_typ = aufruf_logik;
00424
00425 if (the_logik -> einstimmungs_name)
00426 {
00427
00428 struct tonsystem * help_tonsystem;
00429
00430 struct umstimmung * help_umstimmung;
00431 help_tonsystem = parser_get_tonsystem (the_logik->einstimmungs_name,
00432 list_of_tonsysteme);
00433
00434 if (help_tonsystem) {
00435 help -> u.aufruf_logik.einstimmung = expandiere_tonsystem (help_tonsystem);
00436 } else {
00437 help_umstimmung = get_umstimmung (the_logik->einstimmungs_name,
00438 list_of_umstimmungen);
00439
00440 if (help_umstimmung) {
00441 help -> u.aufruf_logik.einstimmung = expandiere_umstimmung (help_umstimmung, NULL);
00442 } else {
00443 fatal_error (0, __FILE__, __LINE__);
00444 help -> u.aufruf_logik.einstimmung = NULL;
00445 }
00446 }
00447 } else
00448 help -> u.aufruf_logik.einstimmung = NULL;
00449
00450 i = get_logik_nummer (the_logik -> name, list_of_logiken);
00451
00452 help -> u.aufruf_logik.lokal_harmonie = & first_lokal_harmonie [i];
00453
00454 help -> u.aufruf_logik.lokal_keyboard = & first_lokal_keyboard [i];
00455
00456 help -> u.aufruf_logik.lokal_midi = & first_lokal_midi [i];
00457
00458 help -> next = NULL;
00459
00460 return help;
00461 }
00462
00463 static struct do_aktion * expand_aktions_liste (
00464
00465 struct aktions_liste * the_liste,
00466
00467 struct interpreter_parameter_liste * aktuelle_parameter)
00468 {
00469
00470 struct do_aktion * help_1, * help_2, ** help_3;
00471
00472 if (the_liste == NULL) return NULL;
00473
00474 if (the_liste -> aktions_typ == aktion_aufruf)
00475 {
00476 help_1 = expandiere_name (the_liste -> u.aktion_aufruf.name,
00477 the_liste -> u.aktion_aufruf.argument_liste,
00478 aktuelle_parameter);
00479 } else if (the_liste -> aktions_typ == aktion_midi_out)
00480 {
00481 help_1 = expandiere_midi (the_liste -> u.aktion_midi_out.midi_code);
00482 } else
00483 fatal_error (0, __FILE__, __LINE__);
00484
00485 help_2 = expand_aktions_liste (the_liste -> next, aktuelle_parameter);
00486
00487 for (help_3 = & help_1; * help_3; help_3 = & (*help_3)->next)
00488 ;
00489
00490 * help_3 = help_2;
00491
00492 return help_1;
00493
00494 }
00495
00496
00497 static struct case_element * expand_case_liste (
00498
00499 struct case_liste * the_liste,
00500
00501 struct interpreter_parameter_liste * aktuelle_parameter)
00502 {
00503
00504 struct case_element * start_liste = NULL;
00505
00506 struct case_element ** ende_liste = & start_liste;
00507
00508 struct case_liste * lauf_liste;
00509
00510 for (lauf_liste = the_liste; lauf_liste; lauf_liste = lauf_liste -> next)
00511 {
00512 if ( ! lauf_liste -> is_default ) {
00513
00514 *ende_liste = (case_element*) xmalloc (sizeof (struct case_element));
00515 (*ende_liste) -> case_wert = lauf_liste -> case_label;
00516 (*ende_liste) -> is_default = 0;
00517 (*ende_liste) -> case_aktion =
00518 expand_aktions_liste (
00519 lauf_liste -> case_aktion,
00520 aktuelle_parameter);
00521 (*ende_liste) -> next = NULL;
00522 ende_liste = & (*ende_liste) -> next;
00523 }
00524 }
00525
00526 for (lauf_liste = the_liste; lauf_liste; lauf_liste = lauf_liste -> next)
00527 {
00528 if ( lauf_liste -> is_default ) {
00529
00530 *ende_liste = (case_element*) xmalloc (sizeof (struct case_element));
00531 (*ende_liste) -> case_wert = lauf_liste -> case_label;
00532 (*ende_liste) -> is_default = 1;
00533 (*ende_liste) -> case_aktion =
00534 expand_aktions_liste (
00535 lauf_liste -> case_aktion,
00536 aktuelle_parameter);
00537 (*ende_liste) -> next = NULL;
00538 ende_liste = & (*ende_liste) -> next;
00539 }
00540 }
00541
00542 return start_liste;
00543 }
00544
00545
00546 static struct do_aktion * expandiere_umstimmung (
00547
00548 struct umstimmung * the_umstimmung,
00549
00550 struct interpreter_parameter_liste * aktuelle_parameter)
00551 {
00552
00553 struct do_aktion * help;
00554
00555 help = (do_aktion*) xmalloc (sizeof (struct do_aktion));
00556 help -> name = the_umstimmung -> name;
00557
00558 switch (the_umstimmung -> umstimmung_typ)
00559 {
00560
00561 case umstimmung_taste_abs:
00562 help -> aufruf_typ = aufruf_umst_taste_abs;
00563
00564 help -> u.aufruf_umst_taste_abs.wert =
00565 get_wert_of_argument ( & the_umstimmung->u.umstimmung_taste_abs.argument,
00566 aktuelle_parameter);
00567
00568 help -> next = NULL;
00569
00570 return help;
00571
00572
00573
00574 case umstimmung_breite_abs:
00575 help -> aufruf_typ = aufruf_umst_breite_abs;
00576
00577 help -> u.aufruf_umst_breite_abs.wert =
00578 get_wert_of_argument ( & the_umstimmung->u.umstimmung_breite_abs.argument,
00579 aktuelle_parameter);
00580
00581 help -> next = NULL;
00582
00583 return help;
00584
00585
00586
00587 case umstimmung_wiederholung_abs:
00588 help -> aufruf_typ = aufruf_umst_wiederholung_abs;
00589
00590 help -> u.aufruf_umst_wiederholung_abs.faktor =
00591 DOUBLE_TO_LONG (
00592 FAKTOR_TO_MIDI (
00593 get_wert_komplex_intervall (
00594 the_umstimmung->u.umstimmung_wiederholung_abs.komplex_liste)));
00595
00596 help -> next = NULL;
00597
00598 return help;
00599
00600
00601
00602 case umstimmung_wiederholung_rel:
00603 help -> aufruf_typ = aufruf_umst_wiederholung_rel;
00604
00605 help -> u.aufruf_umst_wiederholung_rel.faktor =
00606 DOUBLE_TO_LONG (
00607 FAKTOR_TO_MIDI (
00608 get_wert_komplex_intervall (
00609 the_umstimmung->u.umstimmung_wiederholung_abs.komplex_liste)));
00610
00611 help -> next = NULL;
00612
00613 return help;
00614
00615
00616
00617 case umstimmung_taste_rel:
00618 help -> aufruf_typ = aufruf_umst_taste_rel;
00619
00620 help -> u.aufruf_umst_taste_rel.wert =
00621 get_wert_of_argument ( & the_umstimmung->u.umstimmung_taste_rel.argument,
00622 aktuelle_parameter);
00623
00624 help -> u.aufruf_umst_taste_rel.rechenzeichen = the_umstimmung->u.umstimmung_taste_rel.rechenzeichen;
00625
00626 help -> next = NULL;
00627
00628 return help;
00629
00630
00631
00632 case umstimmung_breite_rel:
00633 help -> aufruf_typ = aufruf_umst_breite_rel;
00634
00635 help -> u.aufruf_umst_breite_rel.wert =
00636 get_wert_of_argument ( & the_umstimmung->u.umstimmung_breite_rel.argument,
00637 aktuelle_parameter);
00638
00639 help -> u.aufruf_umst_breite_rel.rechenzeichen = the_umstimmung->u.umstimmung_breite_rel.rechenzeichen;
00640
00641 help -> next = NULL;
00642
00643 return help;
00644
00645
00646
00647 case umstimmung_toene_veraendert:
00648 help -> aufruf_typ = aufruf_umst_toene_veraendert;
00649
00650 help -> u.aufruf_umst_toene_veraendert.tonliste =
00651 expand_tonliste ( the_umstimmung->u.umstimmung_toene_veraendert.tonliste);
00652
00653 help -> next = NULL;
00654
00655 return help;
00656
00657
00658
00659 case umstimmung_umstimmungsbund:
00660 xfree (help);
00661
00662 return expand_aktions_liste (the_umstimmung->u.umstimmung_umstimmungsbund.aktions_liste,
00663 aktuelle_parameter);
00664
00665
00666
00667 case umstimmung_umstimmungs_case:
00668 help -> aufruf_typ = aufruf_umst_umst_case;
00669
00670 help -> u.aufruf_umst_umst_case.wert =
00671 get_wert_of_argument ( & the_umstimmung->u.umstimmung_umstimmungs_case.argument,
00672 aktuelle_parameter);
00673
00674 help -> u.aufruf_umst_umst_case.umst_case =
00675 expand_case_liste (the_umstimmung->u.umstimmung_umstimmungs_case.umstimmungs_case_liste,
00676 aktuelle_parameter);
00677
00678 help -> next = NULL;
00679
00680 return help;
00681
00682
00683
00684 case umstimmung_midi_out:
00685 help -> aufruf_typ = aufruf_midi_out;
00686
00687 help -> u.aufruf_midi_out.out_liste =
00688 the_umstimmung->u.umstimmung_midi_out.out_liste;
00689
00690 help -> next = NULL;
00691
00692 return help;
00693
00694
00695
00696 default:
00697 fatal_error (0, __FILE__, __LINE__);
00698
00699 return NULL;
00700
00701 }
00702 }
00703
00704
00705
00706 static struct do_aktion * expandiere_name (
00707 const char * name,
00708
00709 struct argument_liste * parameter,
00710
00711 struct interpreter_parameter_liste * bezugs_liste)
00712 {
00713
00714 struct logik * help_logik;
00715
00716 struct tonsystem * help_tonsystem;
00717
00718 struct umstimmung * help_umstimmung;
00719
00720 if (name == NULL) return NULL;
00721
00722
00723 help_logik = get_logik (name, list_of_logiken);
00724
00725 if (help_logik)
00726 {
00727
00728 return expandiere_logik (help_logik);
00729
00730 } else
00731 {
00732
00733 help_tonsystem = parser_get_tonsystem (name, list_of_tonsysteme);
00734
00735 if (help_tonsystem) {
00736
00737 return expandiere_tonsystem (help_tonsystem);
00738
00739 } else {
00740
00741 help_umstimmung = get_umstimmung (name, list_of_umstimmungen);
00742
00743 if (help_umstimmung) {
00744
00745 struct interpreter_parameter_liste * aktuelle_parameter;
00746 aktuelle_parameter = gen_parameter_liste (parameter, bezugs_liste);
00747 return expandiere_umstimmung (help_umstimmung,
00748 aktuelle_parameter);
00749
00750 } else
00751 fatal_error (0, __FILE__, __LINE__);
00752
00753 return NULL;
00754 }
00755 }
00756
00757 }
00758
00759 static struct do_aktion * expandiere_midi (struct midiliste * liste)
00760 {
00761
00762 struct do_aktion * help;
00763
00764 help = (do_aktion*) xmalloc (sizeof (struct do_aktion));
00765 help -> name = "MidiOut";
00766 help -> aufruf_typ = aufruf_midi_out;
00767 help -> u.aufruf_midi_out.out_liste = liste;
00768 help -> next = NULL;
00769
00770 return help;
00771 }
00772
00773
00774 static int * create_midi_scan_liste (struct midiliste * lauf)
00775 {
00776 int j, k, * ret;
00777
00778 j = midi_list_laenge (lauf);
00779
00780 ret = (int*) xcalloc((size_t)(j+1), sizeof(int));
00781
00782 for (k=0; lauf; lauf=lauf->next, k++)
00783 ret [k] = lauf->midi_code;
00784
00785 ret [k] = -1;
00786
00787 return ret;
00788 }
00789
00790 PATTERNN * expand_pattern (const char * harmonie_name)
00791
00792 {
00793
00794 struct harmonie * the_harmonie;
00795 PATTERNN * help;
00796 int i;
00797
00798 struct taste * lauf_taste;
00799
00800 the_harmonie = get_harmonie (harmonie_name, list_of_harmonien);
00801
00802 if (the_harmonie == NULL) {
00803 fatal_error (0, __FILE__, __LINE__);
00804 }
00805
00806 help = (PTRN*) xmalloc (sizeof (PATTERNN));
00807
00808 for (i=0;i<MAX_BREITE;i++) help->tonigkeit[i]=1;
00809
00810 for (lauf_taste = the_harmonie->tastenliste;
00811 lauf_taste;
00812 lauf_taste = lauf_taste -> next) {
00813 if (lauf_taste->stern=='*')
00814 help->tonigkeit[lauf_taste->code]=0;
00815 else
00816 help->tonigkeit[lauf_taste->code]=2;
00817 }
00818
00819 return help;
00820 }
00821
00822
00823 void insert_in_globale_liste (int instrument, struct logik * lauf)
00824
00825 {
00826
00827 struct harmonie_ereignis ** temp_harmonie;
00828
00829 struct keyboard_ereignis ** temp_keyboard;
00830
00831 struct midi_ereignis ** temp_midi;
00832
00833 if (lauf->ausloeser)
00834 {
00835 switch ((lauf->ausloeser)->ausloeser_typ) {
00836
00837 case ausloeser_harmonie:
00838 if (lauf->ausloeser->u.ausloeser_harmonie.vortaste == -2)
00839
00840 break;
00841
00842
00843 for (temp_harmonie = & first_harmonie[instrument];
00844 *temp_harmonie;
00845 temp_harmonie = & (*temp_harmonie)->next)
00846 ;
00847
00848 *temp_harmonie = (harmonie_ereignis*) xmalloc( (size_t)sizeof(struct harmonie_ereignis));
00849
00850 (*temp_harmonie) -> pattern=expand_pattern ((lauf->ausloeser)->u.ausloeser_harmonie.name) ;
00851
00852 (*temp_harmonie) -> ist_harmonieform=0;
00853
00854 (*temp_harmonie) -> vortaste=(lauf->ausloeser)->u.ausloeser_harmonie.vortaste ;
00855
00856 (*temp_harmonie) -> nachtaste=(lauf->ausloeser)->u.ausloeser_harmonie.nachtaste ;
00857
00858 (*temp_harmonie) -> name=lauf->name;
00859
00860 (*temp_harmonie) -> aktion=NULL;
00861
00862 (*temp_harmonie) -> the_logik_to_expand=lauf;
00863
00864 (*temp_harmonie) -> next=NULL;
00865
00866 break;
00867
00868 case ausloeser_harmonie_form:
00869 if (lauf->ausloeser->u.ausloeser_harmonie_form.vortaste == -2)
00870
00871 break;
00872
00873
00874 for (temp_harmonie = & first_harmonie[instrument];
00875 *temp_harmonie;
00876 temp_harmonie = & (*temp_harmonie)->next)
00877 ;
00878
00879 *temp_harmonie = (harmonie_ereignis*) xmalloc((size_t)sizeof(struct harmonie_ereignis));
00880
00881 (*temp_harmonie) -> pattern=expand_pattern ((lauf->ausloeser)->u.ausloeser_harmonie_form.name) ;
00882
00883 (*temp_harmonie) -> ist_harmonieform=1;
00884
00885 (*temp_harmonie) -> vortaste=(lauf->ausloeser)->u.ausloeser_harmonie_form.vortaste ;
00886
00887 (*temp_harmonie) -> nachtaste=(lauf->ausloeser)->u.ausloeser_harmonie_form.nachtaste ;
00888
00889 (*temp_harmonie) -> name=lauf->name;
00890
00891 (*temp_harmonie) -> aktion=NULL;
00892
00893 (*temp_harmonie) -> the_logik_to_expand=lauf;
00894
00895 (*temp_harmonie) -> next=NULL;
00896
00897 break;
00898
00899 case ausloeser_taste:
00900
00901 for (temp_keyboard = & first_keyboard[instrument];
00902 *temp_keyboard;
00903 temp_keyboard = & (*temp_keyboard)->next)
00904 ;
00905
00906 *temp_keyboard = (keyboard_ereignis*) xmalloc((size_t)sizeof(struct keyboard_ereignis));
00907
00908 (*temp_keyboard) -> taste= (*((lauf->ausloeser)->u.ausloeser_taste.taste)) ;
00909
00910 (*temp_keyboard) -> name=lauf->name;
00911
00912 (*temp_keyboard) -> aktion=NULL;
00913
00914 (*temp_keyboard) -> the_logik_to_expand=lauf;
00915
00916 (*temp_keyboard) -> next=NULL;
00917
00918 break;
00919
00920 case ausloeser_midi_in:
00921
00922 for (temp_midi = & first_midi[instrument];
00923 *temp_midi;
00924 temp_midi = & (*temp_midi)->next)
00925 ;
00926
00927 *temp_midi = (midi_ereignis*) xmalloc((size_t)sizeof(struct midi_ereignis));
00928
00929
00930
00931 (*temp_midi) -> first_pos =
00932 (*temp_midi) -> scan_pos =
00933 create_midi_scan_liste (lauf->ausloeser->u.ausloeser_midi_in.midi_code);
00934
00935 (*temp_midi) -> name = lauf->name;
00936
00937 (*temp_midi) -> aktion=NULL;
00938
00939 (*temp_midi) -> the_logik_to_expand=lauf;
00940
00941 (*temp_midi) -> next = NULL;
00942
00943 break;
00944
00945 default:
00946 fatal_error(0, __FILE__, __LINE__);
00947 }
00948 }
00949 }
00950
00951 void insert_in_lokale_liste (int instrument, struct anweisung * lauf,
00952
00953 const char * name_der_logik)
00954 {
00955
00956 struct harmonie_ereignis ** temp_harmonie;
00957
00958 struct keyboard_ereignis ** temp_keyboard;
00959
00960 struct midi_ereignis ** temp_midi;
00961
00962 if (lauf->ausloeser)
00963 {
00964 switch ((lauf->ausloeser)->ausloeser_typ) {
00965
00966 case ausloeser_harmonie:
00967 if (lauf->ausloeser->u.ausloeser_harmonie.vortaste == -2)
00968
00969 break;
00970
00971
00972 for (temp_harmonie = & first_lokal_harmonie[instrument];
00973 *temp_harmonie;
00974 temp_harmonie = & (*temp_harmonie)->next)
00975 ;
00976
00977 *temp_harmonie = (harmonie_ereignis*) xmalloc( (size_t)sizeof(struct harmonie_ereignis));
00978
00979 (*temp_harmonie) -> pattern =expand_pattern ((lauf->ausloeser)->u.ausloeser_harmonie.name) ;
00980
00981 (*temp_harmonie) -> ist_harmonieform=0;
00982
00983 (*temp_harmonie) -> vortaste=(lauf->ausloeser)->u.ausloeser_harmonie.vortaste ;
00984
00985 (*temp_harmonie) -> nachtaste=(lauf->ausloeser)->u.ausloeser_harmonie.nachtaste ;
00986
00987 (*temp_harmonie) -> name=name_der_logik;
00988
00989 (*temp_harmonie) -> aktion=
00990 expand_aktions_liste (lauf->aktion, start_parameter_liste);
00991
00992 (*temp_harmonie) -> next=NULL;
00993
00994 break;
00995
00996 case ausloeser_harmonie_form:
00997 if (lauf->ausloeser->u.ausloeser_harmonie_form.vortaste == -2)
00998
00999 break;
01000
01001
01002 for (temp_harmonie = & first_lokal_harmonie[instrument];
01003 *temp_harmonie;
01004 temp_harmonie = & (*temp_harmonie)->next)
01005 ;
01006
01007 *temp_harmonie = (harmonie_ereignis*) xmalloc((size_t)sizeof(struct harmonie_ereignis));
01008
01009 (*temp_harmonie) -> pattern=expand_pattern ((lauf->ausloeser)->u.ausloeser_harmonie_form.name) ;
01010
01011 (*temp_harmonie) -> ist_harmonieform=1;
01012
01013 (*temp_harmonie) -> vortaste=(lauf->ausloeser)->u.ausloeser_harmonie_form.vortaste ;
01014
01015 (*temp_harmonie) -> nachtaste=(lauf->ausloeser)->u.ausloeser_harmonie_form.nachtaste ;
01016
01017 (*temp_harmonie) -> name=name_der_logik;
01018
01019 (*temp_harmonie) -> aktion=
01020 expand_aktions_liste (lauf->aktion, start_parameter_liste);
01021
01022 (*temp_harmonie) -> next=NULL;
01023
01024 break;
01025
01026 case ausloeser_default:
01027
01028 for (temp_harmonie = & first_lokal_harmonie[instrument];
01029 *temp_harmonie;
01030 temp_harmonie = & (*temp_harmonie)->next)
01031 ;
01032
01033 *temp_harmonie = (harmonie_ereignis*) xmalloc((size_t)sizeof(struct harmonie_ereignis));
01034
01035 (*temp_harmonie) -> pattern=NULL ;
01036
01037 (*temp_harmonie) -> ist_harmonieform=2;
01038
01039
01040
01041 (*temp_harmonie) -> vortaste=0 ;
01042
01043 (*temp_harmonie) -> nachtaste=0 ;
01044
01045 (*temp_harmonie) -> name=name_der_logik;
01046
01047 (*temp_harmonie) -> aktion=
01048 expand_aktions_liste (lauf->aktion, start_parameter_liste);
01049
01050 (*temp_harmonie) -> next=NULL;
01051
01052 break;
01053
01054 case ausloeser_taste:
01055
01056 for (temp_keyboard = & first_lokal_keyboard[instrument];
01057 *temp_keyboard;
01058 temp_keyboard = & (*temp_keyboard)->next)
01059 ;
01060
01061 *temp_keyboard = (keyboard_ereignis*) xmalloc((size_t)sizeof(struct keyboard_ereignis));
01062
01063 (*temp_keyboard) -> taste= (*((lauf->ausloeser)->u.ausloeser_taste.taste)) ;
01064
01065 (*temp_keyboard) -> name=name_der_logik;
01066
01067 (*temp_keyboard) -> aktion=
01068 expand_aktions_liste (lauf->aktion, start_parameter_liste);
01069
01070 (*temp_keyboard) -> next=NULL;
01071
01072 break;
01073
01074 case ausloeser_midi_in:
01075
01076 for (temp_midi = & first_lokal_midi[instrument];
01077 *temp_midi;
01078 temp_midi = & (*temp_midi)->next)
01079 ;
01080
01081 *temp_midi = (midi_ereignis*) xmalloc((size_t)sizeof(struct midi_ereignis));
01082
01083
01084
01085 (*temp_midi) -> first_pos =
01086 (*temp_midi) -> scan_pos =
01087 create_midi_scan_liste (lauf->ausloeser->u.ausloeser_midi_in.midi_code);
01088
01089 (*temp_midi) -> name=name_der_logik;
01090
01091 (*temp_midi) -> aktion=
01092 expand_aktions_liste (lauf->aktion, start_parameter_liste);
01093
01094 (*temp_midi) -> next = NULL;
01095
01096 break;
01097
01098 default:
01099 fatal_error(0, __FILE__, __LINE__);
01100 }
01101 }
01102 }
01103
01104
01105 static void expandiere_in_globale_liste (void)
01106 {
01107
01108 struct harmonie_ereignis * lauf_harmonie [MAX_BOX];
01109
01110 struct keyboard_ereignis * lauf_keyboard [MAX_BOX];
01111
01112 struct midi_ereignis * lauf_midi [MAX_BOX];
01113 int i;
01114
01115 for (i=0; i<MAX_BOX; i++) {
01116 lauf_harmonie[i] = first_harmonie[i];
01117 lauf_keyboard[i] = first_keyboard[i];
01118 lauf_midi [i] = first_midi [i];
01119 }
01120
01121 while (lauf_harmonie[0]) {
01122 int j;
01123
01124 lauf_harmonie[0] -> aktion =
01125 expandiere_logik (lauf_harmonie[0] -> the_logik_to_expand);
01126
01127 for (j=1; j<MAX_BOX; j++) {
01128 lauf_harmonie[j] -> aktion = lauf_harmonie[0] -> aktion;
01129 }
01130
01131 for (j=0; j<MAX_BOX; j++) {
01132 lauf_harmonie[j] = lauf_harmonie[j] -> next;
01133 }
01134 }
01135
01136
01137
01138 while (lauf_keyboard[0]) {
01139 int j;
01140
01141 lauf_keyboard[0] -> aktion =
01142 expandiere_logik (lauf_keyboard[0] -> the_logik_to_expand);
01143
01144 for (j=1; j<MAX_BOX; j++) {
01145 lauf_keyboard[j] -> aktion = lauf_keyboard[0] -> aktion;
01146 }
01147
01148 for (j=0; j<MAX_BOX; j++) {
01149 lauf_keyboard[j] = lauf_keyboard[j] -> next;
01150 }
01151 }
01152
01153
01154
01155 while (lauf_midi[0]) {
01156 int j;
01157
01158 lauf_midi[0] -> aktion =
01159 expandiere_logik (lauf_midi[0] -> the_logik_to_expand);
01160
01161 for (j=1; j<MAX_BOX; j++) {
01162 lauf_midi[j] -> aktion = lauf_midi[0] -> aktion;
01163 }
01164
01165 for (j=0; j<MAX_BOX; j++) {
01166 lauf_midi[j] = lauf_midi[j] -> next;
01167 }
01168 }
01169
01170 }
01171
01172
01173
01174
01175 static struct harmonie_ereignis **
01176
01177 get_ende_harmonie (struct harmonie_ereignis ** lauf)
01178 {
01179 if (*lauf == NULL) return lauf;
01180
01181 return get_ende_harmonie (& (*lauf) -> next);
01182 }
01183
01184 static struct keyboard_ereignis **
01185
01186 get_ende_keyboard (struct keyboard_ereignis ** lauf)
01187 {
01188 if (*lauf == NULL) return lauf;
01189
01190 return get_ende_keyboard (& (*lauf) -> next);
01191 }
01192
01193 static struct midi_ereignis **
01194
01195 get_ende_midi (struct midi_ereignis ** lauf)
01196 {
01197 if (*lauf == NULL) return lauf;
01198
01199 return get_ende_midi (& (*lauf) -> next);
01200 }
01201
01202
01203
01204
01205
01206 void mutabor_tabellen_generator (void)
01207 {
01208
01209 cache_konstanten = NULL;
01210
01211
01212
01213 struct logik * lauf;
01214
01215 struct anweisung * lauf_anweisung;
01216 int i;
01217
01218
01219 for (i=0; i<MAX_BOX; i++) {
01220 first_midi [i] = NULL;
01221 first_keyboard [i] = NULL;
01222 first_harmonie [i] = NULL;
01223 }
01224
01225
01226 for (i=0;i<MAX_BOX;i++) {
01227
01228
01229
01230
01231
01232 for (lauf = list_of_logiken; lauf; lauf = lauf -> next) {
01233
01234 insert_in_globale_liste (i, lauf);
01235 }
01236
01237 last_global_harmonie[i]=get_ende_harmonie (& first_harmonie[i]);
01238
01239 last_global_keyboard[i]=get_ende_keyboard (& first_keyboard[i]);
01240 last_global_midi[i]=get_ende_midi (& first_midi[i]);
01241 }
01242
01243
01244
01245
01246
01247 i = logik_list_laenge (list_of_logiken);
01248
01249 first_lokal_harmonie = (harmonie_ereignis* *) xcalloc ((size_t)i, sizeof(first_lokal_harmonie[0]));
01250
01251 first_lokal_keyboard = (keyboard_ereignis* *) xcalloc ((size_t)i, sizeof(first_lokal_keyboard[0]));
01252
01253 first_lokal_midi = (midi_ereignis* *) xcalloc ((size_t)i, sizeof(first_lokal_midi[0]));
01254
01255
01256
01257 for (lauf=list_of_logiken, i=0;
01258 lauf;
01259 lauf=lauf->next, i++ ) {
01260
01261 for (lauf_anweisung=lauf->anweisungsliste; lauf_anweisung;
01262 lauf_anweisung=lauf_anweisung->next) {
01263
01264 insert_in_lokale_liste (i, lauf_anweisung, lauf->name);
01265 }
01266 }
01267
01268
01269 expandiere_in_globale_liste ();
01270
01271 }
01272
01273
01274
01275