Hi Folks, I made an init file "persian.ly" with support for Persian accidentals and scale signatures. The only thing missing is correct glyphs for koron and sori. I include it below.
Kees ----- Original Message ----- From: Behnam Rassi <[email protected]> Date: Sunday, February 15, 2009 4:02 pm Subject: Re: Persian musical koron and sori To: Graham Breed <[email protected]> Cc: Kees van den Doel <[email protected]>, Hans Aberg <[email protected]>, lilypond <[email protected]> > On 15-Feb-09, at 6:45 PM, Graham Breed wrote: > > > Behnam Rassi wrote: > >> Yes Kees I downloaded the font and saw the glyphs. > >> This is as far as I can go with my current work too. Except > that I > >> will add additional Persian music notations (and perhaps > somewhat > >> better looking glyphs!). But I can only produce a font in > ttf > >> format, another one perhaps in otf format. I can also extract > the > >> glyphs in EPS format individually. I wouldn't know how to put > them > >> in LilyPond. > > > > You need to say what interval (as a fraction of a 200 cent > whole > > tone) you want each symbol to correspond to. > > I guess this has been already sorted out for koron and sori > before I > was exposed to this. If not, I can do some research to provide > the > information. The other notations I mentioned are more like > overhead > marks about 'how' the note should sound and not 'what'. > I'm not finished with my work yet. I may be able to explain more > when > I'm done. It's still a couple of weeks to go I guess. > > Behnam > > --------------------------------------BEGIN----------persian.ly \version "2.12.0" %{ Author: Kees van den Doel [email protected] This file defines Persian microtonal alterations, the approximate quartertone flat (koron) and the approximate quartertone sharp (sori). They can be obtained by appending 'k' (koron) and 'o' (sori) to the English note symbol. The standard symbols for this were introduced by Vaziri. For now I've represented them by accidentals.mirroredflat and accidentals.sharp.slashslash.stem. Key signatures are defined for all the Persian modes, there are 5 scales with microtones and the normal major scale. All the gushe's from all dastgahs can be notated with these 6. The note immediately following a koron is sometimes (when the interval defined by the note before the koron and after the koron is a minor third, and the note below the finalis in esfahan according to some (but not all) Persian musicians)) lowered by about 20 cents. This is not notated, but considered part of the scale tuning. To accomodate this for getting better sounding MIDI I've introduced the "vlat" (append 'v' to the note) to indicate this. Actually this note should also get a strong vibrato, and the vibrato and low tuning are perceptually integrated (serialism!). In the tuning I've followed "Traditional Persian Art Music, by Dariush Tala'i". The tunings are also very close to those suggested in "The Dastgah Concept in Persian Music, by Hormoz Farhat". See also "Le repertoire-modele de la musique iranienne, by Jean During" which contains measurements of the intervals in actual practice. There are no other tuning issues in Persian music. Because the music is monophonic the difference between just intonation (for example) and equal temperament is not academic, because are no chords where out of tune intervals are noticeable. Note name suffixes: ff for double-flat f for flat k for koron (about quarter-flat, -3/10 of whole tone, 60 cent) o for sori (about quarter-sharp, 2/10 of whole tone, 40 cent) s for sharp x for double-sharp v for 20 cent flat tuned note ("vlat", not notated) %} % Define tunings: #(define-public KORON -3/10) #(define-public SORI 1/5) #(define-public VLAT -1/10) pitchnamesEnglish = #`( (cflatflat . ,(ly:make-pitch -1 0 DOUBLE-FLAT)) (cflat . ,(ly:make-pitch -1 0 FLAT)) (c . ,(ly:make-pitch -1 0 NATURAL)) (csharp . ,(ly:make-pitch -1 0 SHARP)) (csharpsharp . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) (dflatflat . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) (dflat . ,(ly:make-pitch -1 1 FLAT)) (d . ,(ly:make-pitch -1 1 NATURAL)) (dsharp . ,(ly:make-pitch -1 1 SHARP)) (dsharpsharp . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) (eflatflat . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) (eflat . ,(ly:make-pitch -1 2 FLAT)) (e . ,(ly:make-pitch -1 2 NATURAL)) (esharp . ,(ly:make-pitch -1 2 SHARP)) (esharpsharp . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) (fflatflat . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) (fflat . ,(ly:make-pitch -1 3 FLAT)) (f . ,(ly:make-pitch -1 3 NATURAL)) (fsharp . ,(ly:make-pitch -1 3 SHARP)) (fsharpsharp . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) (gflatflat . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) (gflat . ,(ly:make-pitch -1 4 FLAT)) (g . ,(ly:make-pitch -1 4 NATURAL)) (gsharp . ,(ly:make-pitch -1 4 SHARP)) (gsharpsharp . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) (aflatflat . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) (aflat . ,(ly:make-pitch -1 5 FLAT)) (a . ,(ly:make-pitch -1 5 NATURAL)) (asharp . ,(ly:make-pitch -1 5 SHARP)) (asharpsharp . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) (bflatflat . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) (bflat . ,(ly:make-pitch -1 6 FLAT)) (b . ,(ly:make-pitch -1 6 NATURAL)) (bsharp . ,(ly:make-pitch -1 6 SHARP)) (bsharpsharp . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) (cff . ,(ly:make-pitch -1 0 DOUBLE-FLAT)) (cf . ,(ly:make-pitch -1 0 FLAT)) (cv . ,(ly:make-pitch -1 0 VLAT)) (ck . ,(ly:make-pitch -1 0 KORON)) (c . ,(ly:make-pitch -1 0 NATURAL)) (co . ,(ly:make-pitch -1 0 SORI)) (cs . ,(ly:make-pitch -1 0 SHARP)) (css . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) (cx . ,(ly:make-pitch -1 0 DOUBLE-SHARP)) (dff . ,(ly:make-pitch -1 1 DOUBLE-FLAT)) (df . ,(ly:make-pitch -1 1 FLAT)) (dv . ,(ly:make-pitch -1 1 VLAT)) (dk . ,(ly:make-pitch -1 1 KORON)) (d . ,(ly:make-pitch -1 1 NATURAL)) (do . ,(ly:make-pitch -1 1 SORI)) (ds . ,(ly:make-pitch -1 1 SHARP)) (dss . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) (dx . ,(ly:make-pitch -1 1 DOUBLE-SHARP)) (eff . ,(ly:make-pitch -1 2 DOUBLE-FLAT)) (ef . ,(ly:make-pitch -1 2 FLAT)) (ev . ,(ly:make-pitch -1 2 VLAT)) (ek . ,(ly:make-pitch -1 2 KORON)) (e . ,(ly:make-pitch -1 2 NATURAL)) (eo . ,(ly:make-pitch -1 2 SORI)) (es . ,(ly:make-pitch -1 2 SHARP)) (ess . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) (ex . ,(ly:make-pitch -1 2 DOUBLE-SHARP)) (fff . ,(ly:make-pitch -1 3 DOUBLE-FLAT)) (ff . ,(ly:make-pitch -1 3 FLAT)) (fv . ,(ly:make-pitch -1 3 VLAT)) (fk . ,(ly:make-pitch -1 3 KORON)) (f . ,(ly:make-pitch -1 3 NATURAL)) (fo . ,(ly:make-pitch -1 3 SORI)) (fs . ,(ly:make-pitch -1 3 SHARP)) (fss . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) (fx . ,(ly:make-pitch -1 3 DOUBLE-SHARP)) (gff . ,(ly:make-pitch -1 4 DOUBLE-FLAT)) (gf . ,(ly:make-pitch -1 4 FLAT)) (gv . ,(ly:make-pitch -1 4 VLAT)) (gk . ,(ly:make-pitch -1 4 KORON)) (g . ,(ly:make-pitch -1 4 NATURAL)) (go . ,(ly:make-pitch -1 4 SORI)) (gs . ,(ly:make-pitch -1 4 SHARP)) (gss . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) (gx . ,(ly:make-pitch -1 4 DOUBLE-SHARP)) (aff . ,(ly:make-pitch -1 5 DOUBLE-FLAT)) (af . ,(ly:make-pitch -1 5 FLAT)) (av . ,(ly:make-pitch -1 5 VLAT)) (ak . ,(ly:make-pitch -1 5 KORON)) (a . ,(ly:make-pitch -1 5 NATURAL)) (ao . ,(ly:make-pitch -1 5 SORI)) (as . ,(ly:make-pitch -1 5 SHARP)) (ass . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) (ax . ,(ly:make-pitch -1 5 DOUBLE-SHARP)) (bff . ,(ly:make-pitch -1 6 DOUBLE-FLAT)) (bf . ,(ly:make-pitch -1 6 FLAT)) (bv . ,(ly:make-pitch -1 6 VLAT)) (bk . ,(ly:make-pitch -1 6 KORON)) (b . ,(ly:make-pitch -1 6 NATURAL)) (bo . ,(ly:make-pitch -1 6 SORI)) (bs . ,(ly:make-pitch -1 6 SHARP)) (bss . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) (bx . ,(ly:make-pitch -1 6 DOUBLE-SHARP)) ) % Define accidental symbols. % Really need to have accidentals.koron and accidentals.sori persianGlyphs = #`((-3/10 . "accidentals.mirroredflat") (1/5 . "accidentals.sharp.slashslash.stem") (0 . "accidentals.natural") (1/2 . "accidentals.sharp") (-1/2 . "accidentals.flat") (-1/10 . "") (-3/5 . "") (-1 . "accidentals.flatflat") ( 1 . "accidentals.doublesharp") ) \layout { \context { \Score \override KeySignature #'glyph-name-alist = \persianGlyphs \override Accidental #'glyph-name-alist = \persianGlyphs \override AccidentalCautionary #'glyph-name-alist = \persianGlyphs \override TrillPitchAccidental #'glyph-name-alist = \persianGlyphs \override AmbitusAccidental #'glyph-name-alist = \persianGlyphs } } pitchnames = \pitchnamesEnglish #(ly:parser-set-note-names parser pitchnames) %{ Define key signatures for Persian modes Instead of the \key command use e.g. for dastgah shur on D: \set Staff.keySignature = \shurD There are fewer scales than dastgah's in Persian music, and each dastgah can have many scales. So I provide here key signatures for scales (modes) named after representative dastgahs featuring this scale. Dastgah shur can have the 5th degree natural or koron, so two versions are provided (shur, shurk). Secondary dastgahs dashti, abuata, bayat-e-tork have the same signature as shur, and derived dastgah afshari has signature shurk. Nava on G is like shur on D (4th apart). Scale of segah is shurk. Other scales are esfahan (homayoun on C is like esfahan on G, a 5th apart), chahargah, and mokhalef-segah. For dastgahs mahur and rast-panjgah we just use the major scale. Each key signature symbol is appended by a capitalized "key" (or "finalis"). If you want to use the \transpose command you'll have to manually adjust the key signature of the scale. All the various modulatory gushes in all dastgah's can be notated with these key signatures with the exception of delkash in mahur, but traditionally the peculiar accidentals there are notated explicitly. In summary I provide key signatures for: (shur, shurk, esfahan, chahargah, mokhalefsegah). %} shurC = #`( (1 . ,KORON) (2 . ,FLAT) (5 . ,FLAT) (6 . ,FLAT) ) shurD = #`( (2 . ,KORON) (6 . ,FLAT) ) shurE = #`( (3 . ,SORI) ) shurF = #`( (1 . ,FLAT) (2 . ,FLAT) (4 . ,KORON) (5 . ,FLAT) (6 . ,FLAT) ) shurG = #`( (2 . ,FLAT) (5 . ,KORON) (6 . ,FLAT) ) shurA = #`( (6 . ,KORON) ) shurB = #`( (0 . ,SORI) (3 . ,SHARP) ) shurkC = #`( (1 . ,KORON) (2 . ,FLAT) (4 . ,KORON) (5 . ,FLAT) (6 . ,FLAT) ) shurkD = #`( (2 . ,KORON) (5 . ,KORON) (6 . ,FLAT) ) shurkE = #`( (3 . ,SORI) (6 . ,KORON) ) shurkF = #`( (0 . ,KORON) (1 . ,FLAT) (2 . ,FLAT) (4 . ,KORON) (5 . ,FLAT) (6 . ,FLAT) ) shurkG = #`( (1 . ,KORON) (2 . ,FLAT) (5 . ,KORON) (6 . ,FLAT) ) shurkA = #`( (2 . ,KORON) (6 . ,KORON) ) shurkB = #`( (0 . ,SORI) (3 . ,SORI) ) esfahanC = #`( (2 . ,FLAT) (5 . ,KORON) ) esfahanD = #`( (0 . ,SHARP) (6 . ,KORON) ) esfahanE = #`( (0 . ,SORI) (1 . ,SHARP) (3 . ,SHARP) ) esfahanF = #`( (1 . ,KORON) (5 . ,FLAT) (6 . ,FLAT) ) esfahanG = #`( (2 . ,KORON) (3 . ,SHARP) (6 . ,FLAT) ) esfahanA = #`( (3 . ,SORI) (4 . ,SHARP) ) esfahanB = #`( (0 . ,SHARP) (3 . ,SHARP) (4 . ,SORI) (5 . ,SHARP) ) mokhalefsegahC = #`( (2 . ,FLAT) (5 . ,KORON) (6 . ,KORON) ) mokhalefsegahD = #`( (0 . ,SORI) (6 . ,KORON) ) mokhalefsegahE = #`( (0 . ,SORI) (1 . ,SORI) (3 . ,SHARP) ) mokhalefsegahF = #`( (1 . ,KORON) (2 . ,KORON) (5 . ,FLAT) (6 . ,FLAT) ) mokhalefsegahG = #`( (2 . ,KORON) (3 . ,SORI) (6 . ,FLAT) ) mokhalefsegahA = #`( (3 . ,SORI) (4 . ,SORI) ) mokhalefsegahB = #`( (0 . ,SHARP) (3 . ,SHARP) (4 . ,SORI) (5 . ,SORI) ) chahargahC = #`( (1 . ,KORON) (5 . ,KORON) ) chahargahD = #`( (0 . ,SHARP) (2 . ,KORON) (3 . ,SHARP) (6 . ,KORON) ) chahargahE = #`( (0 . ,SORI) (1 . ,SHARP) (3 . ,SORI) (4 . ,SHARP) ) chahargahF = #`( (1 . ,KORON) (4 . ,KORON) (6 . ,FLAT) ) chahargahG = #`( (2 . ,KORON) (3 . ,SHARP) (5 . ,KORON) ) chahargahA = #`( (0 . ,SHARP) (3 . ,SORI) (4 . ,SHARP) (6 . ,KORON) ) chahargahB = #`( (0 . ,SORI) (1 . ,SHARP) (3 . ,SHARP) (4 . ,SORI) (5 . ,SHARP) ) _______________________________________________ lilypond-user mailing list [email protected] http://lists.gnu.org/mailman/listinfo/lilypond-user
