TabGen.cpp
gehe zur Dokumentation dieser Datei
00001 
00031 // ------------------------------------------------------------------
00032 // Mutabor 2.win, 1997, R.Krauße
00033 // Tabellengenerator
00034 // ------------------------------------------------------------------
00035 
00036 #include "Global.h"
00037 #include "Interpre.h"
00038 #include "GrafKern.h"
00039 //#include "MidiKern.h"
00040 #include <math.h>
00041 
00042 /*** Das sind die Anfangslisten des Interpreters **/
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 /***** Dies ist die Hauptprozedur um eine Aktion in die
00066        Laufzeit-Tabellen einzutragen. Liefert Zeiger auf
00067        neu allokierte Aktion zurück.
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 static int enthaelt_nur_konstante_toene (struct ton * lauf)
00136 {
00137     while (lauf) {
00138         if (lauf -> name != NULL           &&
00139             lauf -> ton_typ == ton_komplex &&
00140             lauf -> u.ton_komplex.bezugston [0] == '@' ) {
00141             return 0;
00142         }
00143         lauf = lauf -> next;
00144     }
00145     return 1;
00146 }
00147 
00148 */
00149 
00150 
00151 
00152 /******** Haupt-Expandier-Routine **************/
00153 
00154 
00155 /***** Diese Zweielementige Liste ist Parameterliste bei Logiken */
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 /**** cache_konstanten enthält alle jemals als Wert benutzten
00173       Konstanten (ohne doppelte)
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                 /*    break; */
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         /*    break; */
00291 
00292         default:
00293                 fatal_error (0, __FILE__, __LINE__);
00294 
00295                 return NULL;
00296 
00297                 /*    break; */
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 { /* normaler ton */
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                 /*        break; */
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                 /*        break; */
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                 /*        break; */
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                 /*        break; */
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                 /*        break; */
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                 /*        break; */
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                 /*        break; */
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                 /*        break; */
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                 /*        break; */
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                 /*        break; */
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; /* Off */
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; /* Egal */
00815                 else
00816                         help->tonigkeit[lauf_taste->code]=2; /* On */
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                                 /* Dann unmöglicher Harmonieauslöser */
00840                                 break;
00841 
00842                         /* Neuen Eintrag erzeugen */
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                                 /* Dann unmöglicher Harmonieauslöser */
00871                                 break;
00872 
00873                         /* Neuen Eintrag erzeugen */
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                         /* Neuen Eintrag erzeugen */
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                         /* Neuen Eintrag erzeugen */
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                         /* Werte eintragen */
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                                 /* Dann unmöglicher Harmonieauslöser */
00969                                 break;
00970 
00971                         /* Neuen Eintrag erzeugen */
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                                 /* Dann unmöglicher Harmonieauslöser */
00999                                 break;
01000 
01001                         /* Neuen Eintrag erzeugen */
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                         /* Neuen Eintrag erzeugen */
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                         /* 2 als Wert für ANSONSTEN */
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                         /* Neuen Eintrag erzeugen */
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                         /* Neuen Eintrag erzeugen */
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                         /* Werte eintragen */
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         //Neu:  extra Löschungen
01209         cache_konstanten = NULL;
01210 
01211         /* Ausgabe der Pointer-Setz-Prozeduren */
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                 /* Die globalen Listen werden initialisiert: */
01229 
01230                 /* Die globalen Auslöser werden in die vorbereiteten Listen eingetragen: */
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         /* Die lokalen Listen werden erzeugt: */
01244         /* Es wird ein Array mit Anfangszeigern  auf die lokalen
01245            Auslöser angelegt. Die Nummer der Logik ist index */
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         /* #### Wichtig ist, daß calloc alles auf 0 setzt (NULL)  */
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 } /* end of mutabor_tabellen_generator */
01272 
01273 
01274 
01275 

Erzeugt am Sun Aug 21 2011 10:51:53 für Mutabor von doxygen 1.7.4