void printLegend(int legendheight, int legendwidth) { Array<Array<int> > legend; legend.setSize(legendheight); legend.allowGrowth(0); int i, j; for (i=0; i<legend.getSize(); i++) { legend[i].setSize(legendwidth); legend[i].allowGrowth(0); legend[i].setAll(24); // set to background color } int startrow = legendheight / 5; int endrow = legendheight - 1; int startcol = legendwidth / 5; int endcol = legendwidth - startcol - 1; int dooutline = outlineQ; if (legendwidth < 100) { // don't print outline on a small legend dooutline = 0; } Array<int> diatonic(8); diatonic.allowGrowth(0); diatonic[0] = 0; diatonic[1] = 2; diatonic[2] = 4; diatonic[3] = 5; diatonic[4] = 7; diatonic[5] = 9; diatonic[6] = 11; int v, lastv = -1; for (i=startrow; i<=endrow; i++) { for (j=startcol; j<=endcol; j++) { v = diatonic[int((double)(j-startcol)/(endcol-startcol+1)*7)]; if (dooutline && ((v != lastv) || (j == endcol) || (i==startrow) || (i==endrow))) { legend[i][j] = 25; } else if (i > (endrow + startrow)/2) { // major keys legend[i][j] = v; } else { // minor keys legend[i][j] = v+12; } lastv = v; } } int blackkeyheight = 2 * (endrow - startrow) / 3; int blackend = startrow + blackkeyheight; int blackstartcol = startcol; int blackendcol = endcol; blackstartcol = blackstartcol + (endcol - startcol) / 96; lastv = 0; for (i=startrow; i<=blackend; i++) { for (j=blackstartcol; j<=blackendcol; j++) { v = int((double)(j-blackstartcol)/(blackendcol-blackstartcol+1)*12); if ((v != lastv) || (i==startrow)) { if ((v != 0) && (v != 5)) { legend[i][j] = 25; } lastv = v; continue; } if (!((v==1)||(v==3)||(v==6)||(v==8)||(v==10))) { continue; } if ((i==blackend)) { legend[i][j] = 25; } else if (i > (blackend + startrow)/2) { // major keys legend[i][j] = v; } else { // minor keys legend[i][j] = v+12; } lastv = v; } } Array<const char*> transcolor; transcolor.setSize(26); transcolor.setAll(0); transcolor[24] = colorindex[24]; transcolor[25] = colorindex[25]; int transpose = 0; int rrotate = 0; for (i=0; i<12; i++) { transcolor[i] = colorindex[(i+transpose+rrotate) % 12]; transcolor[i+12] = colorindex[((i+transpose+rrotate) % 12)+12]; } for (i=0; i<legend.getSize(); i++) { for (j=0; j<legend[i].getSize(); j++) { cout << ' ' << transcolor[legend[i][j]]; } cout << "\n"; } }
virtual bool code (PrologElement * parameters, PrologResolution * resolution) { if (! parameters -> isPair ()) return false; PrologElement * left_note = parameters -> getLeft (); parameters = parameters -> getRight (); if (! parameters -> isPair ()) return false; PrologElement * right_note = parameters -> getLeft (); parameters = parameters -> getRight (); if (! parameters -> isPair ()) return false; PrologElement * interval = parameters -> getLeft (); if (left_note -> isPair ()) { PrologElement * note_left = left_note -> getLeft (); if (! note_left -> isAtom ()) return false; int diatonic_left = diatonic (note_left -> getAtom ()); if (diatonic_left < 0) return false; int chromatic_left = chromatic (note_left -> getAtom ()); left_note = left_note -> getRight (); if (! left_note -> isPair ()) return false; PrologElement * octave_left = left_note -> getLeft (); if (! octave_left -> isInteger ()) return false; if (right_note -> isPair ()) { diatonic_left += 28 + octave_left -> getInteger () * 7; chromatic_left += 48 + octave_left -> getInteger () * 12; PrologElement * note_right = right_note -> getLeft (); if (! note_right -> isAtom ()) return false; int diatonic_right = diatonic (note_right -> getAtom ()); if (diatonic_right < 0) return false; int chromatic_right = chromatic (note_right -> getAtom ()); right_note = right_note -> getRight (); if (! right_note -> isPair ()) return false; PrologElement * octave_right = right_note -> getLeft (); if (! octave_right -> isInteger ()) return false; diatonic_right += 28 + octave_right -> getInteger () * 7; chromatic_right += 48 + octave_right -> getInteger () * 12; interval -> setPair (root -> integer (diatonic_right - diatonic_left), root -> pair (root -> integer (chromatic_right - chromatic_left), root -> earth ())); return true; } if (interval -> isPair ()) { PrologElement * diatonic_interval = interval -> getLeft (); if (! diatonic_interval -> isInteger ()) return false; interval = interval -> getRight (); if (! interval -> isPair ()) return false; PrologElement * chromatic_interval = interval -> getLeft (); if (! chromatic_interval -> isInteger ()) return false; int diatonic_right = diatonic_left + diatonic_interval -> getInteger (); int chromatic_right = chromatic_left + chromatic_interval -> getInteger (); int octave_right = octave_left -> getInteger (); while (diatonic_right < 0) {diatonic_right += 7; chromatic_right += 12; octave_right--;} while (diatonic_right > 6) {diatonic_right -= 7; chromatic_right -= 12; octave_right++;} PrologAtom * ret = note (diatonic_right, chromatic_right); if (ret == NULL) return false; right_note -> setPair (root -> atom (ret), root -> pair (root -> integer (octave_right), root -> earth ())); return true; } return false; } if (! right_note -> isPair ()) return false; PrologElement * note_right = right_note -> getLeft (); if (! note_right -> isAtom ()) return false; int diatonic_right = diatonic (note_right -> getAtom ()); if (diatonic_right < 0) return false; int chromatic_right = chromatic (note_right -> getAtom ()); right_note = right_note -> getRight (); if (! right_note -> isPair ()) return false; PrologElement * octave_right = right_note -> getLeft (); if (! octave_right -> isInteger ()) return false; if (! interval -> isPair ()) return false; PrologElement * diatonic_interval = interval -> getLeft (); if (! diatonic_interval -> isInteger ()) return false; interval = interval -> getRight (); if (! interval -> isPair ()) return false; PrologElement * chromatic_interval = interval -> getLeft (); if (! chromatic_interval -> isInteger ()) return false; int diatonic_left = diatonic_right - diatonic_interval -> getInteger (); int chromatic_left = chromatic_right - chromatic_interval -> getInteger (); int octave_left = octave_right -> getInteger (); while (diatonic_left < 0) {diatonic_left += 7; chromatic_left += 12; octave_left--;} while (diatonic_left > 6) {diatonic_left -= 7; chromatic_left -= 12; octave_left++;} PrologAtom * ret = note (diatonic_left, chromatic_left); if (ret == NULL) return false; left_note -> setPair (root -> atom (ret), root -> pair (root -> integer (octave_left), root -> earth ())); return true; }