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 <***@videotron.qc.ca>
Date: Sunday, February 15, 2009 4:02 pm
Subject: Re: Persian musical koron and sori
Post by Graham BreedPost by Behnam RassiYes 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
Post by Graham BreedPost by Behnam Rassiwill add additional Persian music notations (and perhaps
somewhat
Post by Graham BreedPost by Behnam Rassibetter looking glyphs!). But I can only produce a font in
ttf
Post by Graham BreedPost by Behnam Rassiformat, another one perhaps in otf format. I can also extract
the
Post by Graham BreedPost by Behnam Rassiglyphs in EPS format individually. I wouldn't know how to put
them
Post by Graham BreedYou need to say what interval (as a fraction of a 200 cent
whole
Post by Graham Breedtone) 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 ***@shaw.ca
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)
)