diff options
Diffstat (limited to 'Build/source/utils/mtx/mtx-0.60d/analyze.c')
-rw-r--r-- | Build/source/utils/mtx/mtx-0.60d/analyze.c | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/Build/source/utils/mtx/mtx-0.60d/analyze.c b/Build/source/utils/mtx/mtx-0.60d/analyze.c new file mode 100644 index 00000000000..3003eeb9723 --- /dev/null +++ b/Build/source/utils/mtx/mtx-0.60d/analyze.c @@ -0,0 +1,333 @@ +/* Output from p2c 1.21alpha-07.Dec.93, the Pascal-to-C translator */ +/* From input file "analyze.pas" */ + + +#include "p2c.h" + + +#define ANALYZE_G +#include "analyze.h" + + +#ifndef MTX_H +#include "mtx.h" +#endif + +#ifndef STRINGS_H +#include "strings.h" +#endif + +#ifndef LYRICS_H +#include "lyrics.h" +#endif + +#ifndef MTXLINE_H +#include "mtxline.h" +#endif + +#ifndef UPTEXT_H +#include "uptext.h" +#endif + +#ifndef PREAMBLE_H +#include "preamble.h" +#endif + +#ifndef UTILITY_H +#include "utility.h" +#endif + + +Void includeStartString() +{ + voice_index voice; + paragraph_index0 mus; + voice_index FORLIM; + Char STR1[256]; + Char STR2[256]; + + FORLIM = nvoices; + for (voice = 1; voice <= FORLIM; voice++) { + mus = musicLineNo(voice); + if (mus > 0) { + sprintf(STR2, "%s%s", startString(STR1, voice), P[mus-1]); + strcpy(P[mus-1], STR2); + } + } +} + + +Static Char *describe(Result, nbar, extra) +Char *Result; +short nbar, extra; +{ + Char STR1[256]; + Char STR3[256]; + Char STR4[256]; + + sprintf(Result, "%s bar%s + %s/64 notes", + toString(STR1, nbar), plural(STR3, nbar), toString(STR4, extra)); + return Result; +} + + +Void testParagraph() +{ + voice_index0 voice; + voice_index0 leader = 0, nv = 0; + paragraph_index0 mus; + short extra, l, nbar; + voice_index0 FORLIM; + Char STR2[256]; + Char STR3[256]; + + nbars = 0; + pickup = 0; + nleft = 0; + if (top > bottom) + return; + pickup = 0; + multi_bar_rest = false; + FORLIM = bottom; + for (voice = top; voice <= FORLIM; voice++) { + mus = musicLineNo(voice); + if (mus > 0) { /** -------------- Voice is present ---- */ + nv++; + line_no = orig_line_no[mus-1]; + scanMusic(voice, &l); + if (multi_bar_rest && nv > 1) + error("Multi-bar rest allows only one voice", print); + if (!pmx_preamble_done) { + if (voice == top) + pickup = l; + else if (pickup != l) + error3(voice, "The same pickup must appear in all voices"); + } + nbar = numberOfBars(voice); + extra = ExtraLength(voice); + if (multi_bar_rest && (nbar > 0 || extra > 0)) + error3(voice, "Multi-bar rest allows no other rests or notes"); + if (nbar > nbars || nbar == nbars && extra > nleft) { + nbars = nbar; + nleft = extra; + leader = voice; + } + if (!final_paragraph && meternum > 0 && extra > 0) { + printf("Line has %s\n", describe(STR2, nbar, extra)); + error(" Line does not end at complete bar", print); + } + if (pmx_preamble_done && l > 0 && meternum > 0) + error3(voice, "Short bar with no meter change"); + } + } + if (!pmx_preamble_done) { + xmtrnum0 = (double)pickup / one_beat; /* Don't want an integer result */ + if (beVerbose()) + printf("Pickup = %d/64\n", pickup); + } + if (leader <= 0) + return; + FORLIM = bottom; + for (voice = top; voice <= FORLIM; voice++) { + if (musicLineNo(voice) > 0) { + if (voice != leader) { + mus = musicLineNo(voice); + line_no = orig_line_no[mus-1]; + if (numberOfBars(voice) != numberOfBars(leader) || + ExtraLength(voice) != ExtraLength(leader)) { + printf("Following line has %s\n", + describe(STR3, numberOfBars(voice), ExtraLength(voice))); + puts(musicLine(STR3, voice)); + printf("Longest line has %s\n", + describe(STR2, numberOfBars(leader), ExtraLength(leader))); + puts(musicLine(STR2, leader)); + error("Line duration anomaly", print); + } + } + } + } +} + + +Void describeParagraph() +{ + voice_index0 voice; + Char STR2[256]; + voice_index0 FORLIM; + + printf("---- Paragraph %d starting at line %d bar %d\n", + paragraph_no, orig_line_no[0], bar_no); + FORLIM = bottom; + for (voice = top; voice <= FORLIM; voice++) + describeVoice(voice, lyricsReport(STR2, voice)); +} + + +/* Local variables for paragraphSetup: */ +struct LOC_paragraphSetup { + voice_index0 *voice; + short l; + voice_index0 k; + Char P_keep[256], w[256]; + boolean is_labelled; +} ; + +Local Void maybeUptext(i, LINK) +short i; +struct LOC_paragraphSetup *LINK; +{ + if (!doUptext()) + return; + if (strlen(LINK->w) == 1) { + if (*LINK->voice == nvoices) + warning("Uptext line below bottom voice should be labelled", print); + } + if (strlen(LINK->w) == 1) { /** Standard chord line ------ */ + LINK->k = *LINK->voice + 1; + if (LINK->k > nvoices) + LINK->k--; + setUptextLineNo(LINK->k, i); + /** Labelled chord line ---- */ + return; + } + predelete(LINK->w, 1); + LINK->k = findVoice(LINK->w); + if (LINK->k == 0) + error("Uptext line belongs to unknown voice", print); + else + setUptextLineNo(LINK->k, i); +} + +Local Void maybeChords(i, LINK) +short i; +struct LOC_paragraphSetup *LINK; +{ + if (!doChords()) + return; + if (strlen(LINK->w) == 1 && *LINK->voice == 0 && pedanticWarnings()) + warning("Chord line above top voice should be labelled", print); + if (strlen(LINK->w) == 1) { /** Standard chord line ------ */ + LINK->k = *LINK->voice; + if (LINK->k == 0) + LINK->k = 1; + setChordLineNo(LINK->k, i); + /** Labelled chord line ---- */ + return; + } + predelete(LINK->w, 1); + LINK->k = findVoice(LINK->w); + if (LINK->k == 0) + error("Chord line belongs to unknown voice", print); + else + setChordLineNo(LINK->k, i); +} + +Local Void analyzeParagraph(LINK) +struct LOC_paragraphSetup *LINK; +{ + paragraph_index i, FORLIM; + + *LINK->voice = 0; + bottom = 0; + top = nvoices + 1; + clearLabels(); + clearTags(); + clearUptext(); + FORLIM = para_len; + for (i = 1; i <= FORLIM; i++) + { /* ----- Paragraph analysis main loop ----- */ + if (*P[i-1] != '\0' && P[i-1][0] != comment) { + NextWord(LINK->w, P[i-1], blank, colon); + line_no = orig_line_no[i-1]; + LINK->l = strlen(LINK->w); + LINK->is_labelled = (LINK->w[LINK->l-1] == colon && + LINK->w[LINK->l-2] != barsym); + if (LINK->is_labelled) { + strcpy(LINK->P_keep, P[i-1]); + predelete(P[i-1], LINK->l); + shorten(LINK->w, LINK->l - 1); + LINK->k = findVoice(LINK->w); /* First look for a voice label */ + if (LINK->k > 0) { + *LINK->voice = LINK->k; + setMusicLineNo(*LINK->voice, i); + } else if (LINK->w[0] == 'L') + maybeLyrics(*LINK->voice, i, LINK->w); + else if (LINK->w[0] == 'C') + maybeChords(i, LINK); + else if (LINK->w[0] == 'U') + maybeUptext(i, LINK); + else { + if (startsWithIgnoreCase(LINK->w, "SPACE")) { + setSpace(P[i-1]); + must_respace = true; + } else { + if (startsWithIgnoreCase(LINK->w, "VOICES")) { + selectVoices(P[i-1]); + must_restyle = true; + } else { + strcpy(P[i-1], LINK->P_keep); + LINK->is_labelled = false; + if (!isNoteOrRest(LINK->w)) { + error("Unknown line label", print); + /** ------------ Maybe Space command ------------ */ + /** ------------ Maybe Voices command ------------ */ + /** Could be sticky attribute **/ + } + } + } + } + } + if (!LINK->is_labelled) { + (*LINK->voice)++; + setMusicLineNo(*LINK->voice, i); + } + if (*LINK->voice > bottom) + bottom = *LINK->voice; + if (*LINK->voice > 0 && *LINK->voice < top) + top = *LINK->voice; + } + } +} + +Local Void obliterate(LINK) +struct LOC_paragraphSetup *LINK; +{ + paragraph_index i; + Char new_only[256]; + paragraph_index FORLIM; + + *new_only = '\0'; + FORLIM = para_len; + for (i = 0; i <= FORLIM - 1; i++) { + if (startsWithIgnoreCase(P[i], "only:")) { + strcpy(new_only, P[i]); + strcpy(P[i], "%"); + } + } + if (*new_only != '\0') { + setOnly(new_only); + return; + } + FORLIM = para_len; + for (i = 1; i <= FORLIM; i++) { + if (omitLine(i)) + strcpy(P[i-1], "%"); + } +} + + +Void paragraphSetup(voice_) +voice_index0 *voice_; +{ + struct LOC_paragraphSetup V; + + V.voice = voice_; + obliterate(&V); + analyzeParagraph(&V); + reviseLyrics(); +} + + + + +/* End. */ |