diff options
Diffstat (limited to 'Build/source/utils/mtx/mtx-0.60d/status.c')
-rw-r--r-- | Build/source/utils/mtx/mtx-0.60d/status.c | 649 |
1 files changed, 649 insertions, 0 deletions
diff --git a/Build/source/utils/mtx/mtx-0.60d/status.c b/Build/source/utils/mtx/mtx-0.60d/status.c new file mode 100644 index 00000000000..aef14b88a7b --- /dev/null +++ b/Build/source/utils/mtx/mtx-0.60d/status.c @@ -0,0 +1,649 @@ +/* Output from p2c 1.21alpha-07.Dec.93, the Pascal-to-C translator */ +/* From input file "status.pas" */ + + +#include "p2c.h" + + +#define STATUS_G +#include "status.h" + + +#ifndef GLOBALS_H +#include "globals.h" +#endif + +#ifndef STRINGS_H +#include "strings.h" +#endif + +#ifndef MTXLINE_H +#include "mtxline.h" +#endif + +#ifndef CONTROL_H +#include "control.h" +#endif + +#ifndef UTILITY_H +#include "utility.h" +#endif + +#ifndef NOTES_H +#include "notes.h" +#endif + + +#define lowest_pitch (-9) +#define highest_pitch 61 + + +typedef struct line_status { + short pitch, chord_pitch, octave_adjust, beam_level, slur_level, after_slur; + Char octave, lastnote, chord_lastnote, duration, slurID, tieID; + boolean beamnext, beamed, slurnext, slurred, no_beam_melisma; + boolean no_slur_melisma[12]; + int5 chord_tie_pitch; + Char chord_tie_label[6]; +} line_status; + + +Static Char init_oct[256] = ""; +Static line_status current[maxvoices]; +Static Char lastdur[maxvoices]; + + +Void chordTie(voice, lab) +short voice; +Char *lab; +{ + short n; + line_status *WITH; + + WITH = ¤t[voice-1]; + n = strlen(WITH->chord_tie_label); + if (n == 5) + error3(voice, "Only five slur ties allowed per voice"); + if (n == 0) + *lab = 'T'; + else + *lab = WITH->chord_tie_label[n-1]; + (*lab)++; + sprintf(WITH->chord_tie_label + strlen(WITH->chord_tie_label), "%c", *lab); +/* p2c: status.pas, line 66: + * Note: Possible string truncation in assignment [145] */ + n++; + WITH->chord_tie_pitch[n-1] = WITH->chord_pitch; +} + + +Void getChordTies(voice, pitches, labels) +short voice; +short *pitches; +Char *labels; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + memcpy(pitches, WITH->chord_tie_pitch, sizeof(int5)); + strcpy(labels, WITH->chord_tie_label); + *WITH->chord_tie_label = '\0'; +} + + +Void rememberDurations() +{ + voice_index v, FORLIM; + + FORLIM = nvoices; + for (v = 1; v <= FORLIM; v++) + lastdur[v-1] = duration(v); +} + + +Void restoreDurations() +{ + voice_index v, FORLIM; + + FORLIM = nvoices; + for (v = 1; v <= FORLIM; v++) + resetDuration(v, lastdur[v-1]); +} + + +Char duration(voice) +short voice; +{ + return (current[voice-1].duration); +} + + +Void resetDuration(voice, dur) +short voice; +Char dur; +{ + if (pos1(dur, durations) == 0) { + printf("Trying to set duration to %c; ", dur); + error3(voice, "M-Tx system error: resetDuration"); + } + current[voice-1].duration = dur; +} + + +Void activateBeamsAndSlurs(voice) +short voice; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + if (WITH->beamnext) { + WITH->beamed = true; + WITH->beamnext = false; + } + if (WITH->slurnext) { + WITH->slurred = true; + WITH->slurnext = false; + } + if (WITH->slurred) + WITH->after_slur++; +} + + +Void saveStatus(voice) +short voice; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + WITH->chord_pitch = WITH->pitch; + WITH->chord_lastnote = WITH->lastnote; +} + + +boolean noBeamMelisma(voice) +short voice; +{ + return (current[voice-1].no_beam_melisma); +} + + +short afterSlur(voice) +short voice; +{ + short Result; + line_status *WITH; + + WITH = ¤t[voice-1]; + Result = WITH->after_slur; + if (WITH->after_slur > 0 && WITH->slur_level < 1) + error3(voice, "M-Tx system error: afterSlur and slur_level incompatible)"); + return Result; +} + + +Char octave(voice) +short voice; +{ + return (current[voice-1].octave); +} + + +Void resetOctave(voice) +short voice; +{ + current[voice-1].octave = ' '; +} + + +Void initOctaves(octaves) +Char *octaves; +{ + short i = 1; + + strcpy(init_oct, octaves); + while (i <= strlen(init_oct)) { + if (init_oct[i-1] == ' ') + delete1(init_oct, i); + else + i++; + } +} + + +Static Char initOctave(voice_stave) +stave_index voice_stave; +{ + if (voice_stave > strlen(init_oct)) { + if (pos1(clef[voice_stave-1], "Gt08") > 0) + return '4'; + else + return '3'; + } else + return (init_oct[voice_stave-1]); +} + + +Void setOctave(voice) +short voice; +{ + current[voice-1].octave = initOctave(voiceStave(voice)); +} + + +Void newOctave(voice, dir) +short voice; +Char dir; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + switch (dir) { + + case '+': + WITH->octave++; + break; + + case '-': + WITH->octave--; + break; + } +} + + +Static short newPitch(voice, note_, pitch, lastnote) +short voice; +Char *note_; +short pitch; +Char lastnote; +{ + Char note[256]; + short interval, npitch; + Char oct; + + strcpy(note, note_); + /*if debugMode then + write('New pitch for note ',note,' relative to ',lastnote, + ' at pitch ',pitch);*/ + oct = octaveCode(note); + if (oct == '=') + oct = initOctave(voiceStave(voice)); + if (isdigit(oct)) { + pitch = (oct - '0') * 7 - 3; + lastnote = 'f'; + removeOctaveCode(oct, note); + oct = octaveCode(note); + } + interval = note[0] - lastnote; + if (interval > 3) + interval -= 7; + if (interval < -3) + interval += 7; + npitch = pitch + interval; /*if debugMode then write(' was ',npitch);*/ + while (oct != ' ') { + if (oct == '+') + npitch += 7; + else if (oct == '-') + npitch -= 7; + removeOctaveCode(oct, note); + oct = octaveCode(note); + } + /*if debugMode then writeln(' is ',npitch);*/ + return npitch; +} + + +Local Void delins(note, c1, c2, l) +Char *note; +Char c1, c2; +short l; +{ + short i, n; + + n = strlen(note); + i = pos1(c1, note); + if (i == 0) + i = n + 1; + while (l > 0 && i <= n) { + delete1(note, i); + n--; + l--; + } + i = pos1(c2, note); + if (i == 0) { + if (strlen(note) < 2) + error("M-Tx program error", print); + else + i = 3; + } + while (l > 0) { + insertChar(c2, note, i); + l--; + } +} + + +Static Void repitch(note, diff) +Char *note; +short diff; +{ + diff /= 7; + if (diff > 0) + delins(note, '-', '+', diff); + else + delins(note, '+', '-', -diff); +} + + +Void setUnbeamed(voice) +short voice; +{ + current[voice-1].beamed = false; +} + + +Void setUnslurred(voice) +short voice; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + WITH->slurred = false; + WITH->after_slur = 0; +} + + +Void beginBeam(voice, note) +short voice; +Char *note; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + if (WITH->beamed) + error3(voice, "Starting a forced beam while another is open"); + if (WITH->beam_level > 0) + error3(voice, + "Starting a forced beam while another is open (beamlevel>0)"); + WITH->beam_level++; + WITH->beamnext = true; + WITH->no_beam_melisma = startsWith(note, "[["); + if (WITH->no_beam_melisma) + predelete(note, 1); +} + + +Void endBeam(voice) +short voice; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + if (WITH->beam_level < 1) + error3(voice, "Closing a beam that was never opened"); + WITH->beam_level--; + setUnbeamed(voice); +} + + +short slurLevel(voice) +short voice; +{ + return (current[voice-1].slur_level); +} + + +short beamLevel(voice) +short voice; +{ + return (current[voice-1].beam_level); +} + + +boolean noSlurMelisma(voice, history) +short voice, history; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + return (WITH->no_slur_melisma[WITH->slur_level + history - 1]); +} + + +Static Char *slurLabel(Result, voice, note) +Char *Result; +short voice; +Char *note; +{ + Char sl; + + if (*note == '\0') + return strcpy(Result, ""); + if (strlen(note) < 2) + return strcpy(Result, " "); + if (note[1] >= '0' && note[1] <= 'Z') + sl = note[1]; + else + sl = ' '; + if (sl >= 'I' && sl <= 'T') + warning3(voice, "Slur label in the range I..T may cause conflict"); + sprintf(Result, "%c", sl); + return Result; +} + + +Static Void labelSlur(voice, note) +short voice; +Char *note; +{ + Char sl; + line_status *WITH; + + if (*note == '\0') + return; + WITH = ¤t[voice-1]; + if (note[0] == ')') + WITH->slurID += 2; + else if (note[0] == '}') + WITH->tieID += 2; + /** CMO 0.60a: replace assigning tieID to sl by space charater + if (note[1]='(') or (note[1]=')') then sl:=slurID else sl:=tieID; */ + if (note[0] == '(' || note[0] == ')') + sl = WITH->slurID; + else + sl = ' '; + /** CMO 0.60d: omit insertchar in case of tie + insertchar(sl,note,2); */ + if (note[0] == '(' || note[0] == ')') + insertChar(sl, note, 2); + if (note[0] == '(') + WITH->slurID -= 2; + else if (note[0] == '{') + WITH->tieID -= 2; + if (WITH->slurID < 'I') + warning3(voice, "Too many nested slurs may cause conflict"); + if (WITH->tieID < 'I') + warning3(voice, "Too many nested ties may cause conflict"); +} + + +Void beginSlur(voice, note) +short voice; +Char *note; +{ + short posblind; + line_status *WITH; + Char STR1[256], STR2[256]; + + WITH = ¤t[voice-1]; + WITH->slur_level++; + if (WITH->slur_level > 12) + error3(voice, "Too many open slurs"); + WITH->no_slur_melisma[WITH->slur_level - 1] = (startsWith(note, "((") || + startsWith(note, "{{")); + if (WITH->no_slur_melisma[WITH->slur_level - 1]) + predelete(note, 1); + if (!strcmp(slurLabel(STR1, voice, note), "0")) + delete1(note, 2); + else { + if (!strcmp(slurLabel(STR2, voice, note), " ")) + labelSlur(voice, note); + } + posblind = pos1('~', note); + if (posblind > 0) { + if (hideBlindSlurs()) + *note = '\0'; + else + delete1(note, posblind); + } + WITH->slurnext = true; +} + + +Void endSlur(voice, note) +short voice; +Char *note; +{ + short poscontinue, posblind; + Char contslur[256]; + line_status *WITH; + Char STR1[256], STR2[256]; + + WITH = ¤t[voice-1]; + *contslur = '\0'; + if (WITH->slur_level < 1) + error3(voice, "Ending a slur that was never started"); + if (note[0] == ')') + poscontinue = pos1('(', note); + else if (note[0] == '}') + poscontinue = pos1('{', note); + if (poscontinue == 0) + WITH->slur_level--; + else { + poscontinue--; + strcpy(contslur, note); + predelete(contslur, poscontinue); + shorten(note, poscontinue); + } + if (WITH->slur_level == 0) + setUnslurred(voice); + if (!strcmp(slurLabel(STR1, voice, note), "0")) + delete1(note, 2); + else { + if (!strcmp(slurLabel(STR2, voice, note), " ")) + labelSlur(voice, note); + } + if (!strcmp(slurLabel(STR1, voice, contslur), "0")) + delete1(contslur, 2); + else { + if (!strcmp(slurLabel(STR2, voice, contslur), " ")) + labelSlur(voice, contslur); + } + if (poscontinue > 0) { + if (note[0] == '}') + strcat(note, "t"); + note[0] = 's'; + if (contslur[0] == '{') + strcat(contslur, "t"); + contslur[0] = 's'; + } + posblind = pos1('~', note); + if (posblind > 0) { + if (hideBlindSlurs()) + *note = '\0'; + else + delete1(note, posblind); + } + if (*note != '\0' && *contslur != '\0') + sprintf(note + strlen(note), " %s", contslur); +} + + +Void renewPitch(voice, note) +short voice; +Char *note; +{ + short pstat; + line_status *WITH; + + WITH = ¤t[voice-1]; + pstat = newPitch(voice, note, WITH->chord_pitch, WITH->chord_lastnote); + if (debugMode()) + printf("Current pitch in voice %d is %d, last note was %c, this note is %s", + voice, WITH->pitch, WITH->lastnote, note); + WITH->pitch = newPitch(voice, note, WITH->pitch, WITH->lastnote); + if (WITH->pitch != pstat) + repitch(note, WITH->pitch - pstat); + if (WITH->pitch < lowest_pitch && checkPitch()) { + printf("Pitch of note %s following %c reported as %d", + note, WITH->lastnote, WITH->pitch); + error3(voice, "Pitch too low"); + } + if (WITH->pitch > highest_pitch && checkPitch()) { + printf("Pitch of note %s following %c reported as %d", + note, WITH->lastnote, WITH->pitch); + error3(voice, "Pitch too high"); + } + WITH->lastnote = note[0]; + if (debugMode()) + printf(", repitched to %d\n", WITH->pitch); + if (debugMode() && WITH->pitch != pstat) + printf("Pitch from melodic line = %d from last chordal note = %d\n", + WITH->pitch, pstat); +} + + +short chordPitch(voice) +short voice; +{ + return (current[voice-1].chord_pitch); +} + + +Void renewChordPitch(voice, note) +short voice; +Char *note; +{ + line_status *WITH; + + WITH = ¤t[voice-1]; + WITH->chord_pitch = newPitch(voice, note, WITH->chord_pitch, + WITH->chord_lastnote); + if (WITH->chord_pitch < lowest_pitch) + error3(voice, "Pitch in chord too low"); + if (WITH->chord_pitch > highest_pitch) + error3(voice, "Pitch in chord too high"); + WITH->chord_lastnote = note[0]; +} + + +Void initStatus() +{ + short voice, FORLIM; + line_status *WITH; + + FORLIM = nvoices; + for (voice = 1; voice <= FORLIM; voice++) { + WITH = ¤t[voice-1]; + WITH->duration = default_duration; + WITH->octave_adjust = 0; + WITH->slur_level = 0; + WITH->beam_level = 0; + WITH->beamed = false; + WITH->beamnext = false; + WITH->slurred = false; + WITH->slurnext = false; + WITH->after_slur = 0; + WITH->octave = initOctave(voiceStave(voice)); + WITH->slurID = 'S'; + WITH->tieID = 'T'; + WITH->lastnote = 'f'; + WITH->pitch = (WITH->octave - '0') * 7 - 3; + *WITH->chord_tie_label = '\0'; + saveStatus(voice); + } +} + + + + +/* End. */ |