lewdlime / abcm2ps

abcm2ps is a command line program which converts ABC to music sheet in PostScript or SVG format. It is an extension of abc2ps which may handle many voices per staff. abcm2ps is Copyright © 2014-2016 Jean-Francois Moine.
http://moinejf.free.fr/
GNU General Public License v3.0
82 stars 31 forks source link

Wanted a simpler how-to for Arabic/Turkish score transcriptions #115

Open topchyan opened 12 months ago

topchyan commented 12 months ago

I am working with transcriptions of classic ottoman music, which makes heavy use of microtone notation using EasyABC/abcm2ps in Linux. The problem I encounter is complexity of mapping accidentals to play properly in abc2midi as well. So far I found only what's mentioned on in abcmidi documentation. However when I reference this configuration even though notes may be displaying okay, they don't sound properly in MIDI. I am looking for a more simple how-to on how to use configuration settings. A cheat-sheet I found for microtones looks like this.

microtones

At least I would like to configure my scores to properly show and play my most common notes like what's shown there as g4+50, a4-50, g4+33, gs4-33, gs4+33,a4-33,a4+33, bb4+33

Thanks for any help.

moinejf commented 12 months ago

Some years ago (2020), we, Seymour Shlien (abcMIDI), Hudson Lacerda (well-known musician in Brazil) and I (abcm2ps, abc2svg), had long exchanges about the Turkish Makams Scales. Finally, we agreed in common definitions. Here are the ones for abcMIDI and abcm2ps:

%--------------- header --------------- I:abc-charset utf-8

% accidentals Arel - Ezgel %%beginps /sbar {M -4.0 6 RM 5.0 2 RL 1 SLW stroke}! /hbar {M -3.0 -1.5 RM 7.0 3 RL 1.6 SLW stroke}!

/ft15156 {ft0}! % _60/53 - b5 /ft12084 {2 copy ft0 sbar}! % _48/53 - b4 /ft9012 {2 copy ft0 sbar}! % _36/53 - b3 /ft5940 {ft1}! % _24/53 - b2 /ft2868 {ft1}! % _12/53 - b1

/sh2868 {sh1}! % ^12/53 - #1 /sh5940 {sh1}! % ^24/53 - #2 /sh9012 {sh0}! % ^36/53 - #3 /sh12084 {sh0}! % ^48/53 - #4 /sh15156 {2 copy gsave T 0 0 1.2 dup scale sh1 grestore hbar}! % ^60/53 - #5 %%endps

%%MIDI temperamentequal 53 // 53-TET Turkish scale

%--------------- end header ---------------

Otherwise, abc2svg includes natively the Arel - Ezgel accidentals when using

%%MIDI temperamentequal 53

In the ABC source, the accidentals are (as written in the PS definitions):

_60/53 for b5 _48/53 for b4 _36/53 for b3 _24/53 for b2 _12/53 for b1 ^12/53 for #1 ^24/53 for #2 ^36/53 for #3 ^48/53 for #4

Here is a source example with abc2svg

http://moinejf.free.fr/abc/sipihr_pesrev.html
topchyan commented 12 months ago

Thanks for quick response! Will be back with further questions.

On Sat, Nov 18, 2023, 10:49 Jean-François Moine @.***> wrote:

Some years ago (2020), we, Seymour Shlien (abcMIDI), Hudson Lacerda (well-known musician in Brazil) and I (abcm2ps, abc2svg), had long exchanges about the Turkish Makams Scales. Finally, we agreed in common definitions. Here are the ones for abcMIDI and abcm2ps:

%--------------- header --------------- I:abc-charset utf-8

% accidentals Arel - Ezgel %%beginps /sbar {M -4.0 6 RM 5.0 2 RL 1 SLW stroke}! /hbar {M -3.0 -1.5 RM 7.0 3 RL 1.6 SLW stroke}!

/ft15156 {ft0}! % _60/53 - b5 /ft12084 {2 copy ft0 sbar}! % _48/53 - b4 /ft9012 {2 copy ft0 sbar}! % _36/53 - b3 /ft5940 {ft1}! % _24/53 - b2 /ft2868 {ft1}! % _12/53 - b1

/sh2868 {sh1}! % ^12/53 - #1 https://github.com/lewdlime/abcm2ps/issues/1 /sh5940 {sh1}! % ^24/53 - #2 https://github.com/lewdlime/abcm2ps/pull/2 /sh9012 {sh0}! % ^36/53 - #3 https://github.com/lewdlime/abcm2ps/issues/3 /sh12084 {sh0}! % ^48/53 - #4 https://github.com/lewdlime/abcm2ps/issues/4 /sh15156 {2 copy gsave T 0 0 1.2 dup scale sh1 grestore hbar}! % ^60/53 -

5 https://github.com/lewdlime/abcm2ps/issues/5

%%endps

%%MIDI temperamentequal 53 // 53-TET Turkish scale

%--------------- end header ---------------

Otherwise, abc2svg includes natively the Arel - Ezgel accidentals when using

%%MIDI temperamentequal 53

In the ABC source, the accidentals are (as written in the PS definitions):

_60/53 for b5 _48/53 for b4 _36/53 for b3 _24/53 for b2 _12/53 for b1 ^12/53 for #1 https://github.com/lewdlime/abcm2ps/issues/1 ^24/53 for #2 https://github.com/lewdlime/abcm2ps/pull/2 ^36/53 for #3 https://github.com/lewdlime/abcm2ps/issues/3 ^48/53 for #4 https://github.com/lewdlime/abcm2ps/issues/4

Here is a source example with abc2svg

http://moinejf.free.fr/abc/sipihr_pesrev.html

— Reply to this email directly, view it on GitHub https://github.com/lewdlime/abcm2ps/issues/115#issuecomment-1817542600, or unsubscribe https://github.com/notifications/unsubscribe-auth/AD6AZEEC7BVBJA326SL5VFTYFDKIFAVCNFSM6AAAAAA7Q7AFESVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMJXGU2DENRQGA . You are receiving this because you authored the thread.Message ID: @.***>

topchyan commented 12 months ago

I am trying to understand how the header code you mention co-relates with the individual accidentals from the score.

image

So far I have been using another set of codes for accidentals

image

My sample scale now looks like this

image

and it only starts showing up correctly when I disable this MIDI directive

%%MIDI temperamentequal 53 // 53-TET Turkish scale

image

All in all, I would like to stick with one modern and consistent markup for the music which is expected to last for a while.

Thanks for your replies and help!

moinejf commented 12 months ago

I added the correct PostScript definition of the turkish accidentals in the %%MIDI documentation. In fact, all about the microtone accidentals is in this page.

There are two ways for writing microtone accidentals in ABC (at least in abcm2ps, abc2svg and txtmus).

The common way is to specify a fraction of a semi-tone before the accidental, as "_23/44B". In this case, there is no notion of scale or temperament.

The command "%%MIDI temperamentequal " divides the octave into

intervals. These intervals are mapped to the 12 notes of the octave for the scale to be the closest to a well tempered scale. In this case, as the microtone divider is known, only the numerator appears in the accidentals like "_2B". Mixing both ways is not a good idea! You may also note that, with temperamentequal, an accidental without a numerator as "_B" is ambiguous.
topchyan commented 12 months ago

Could you share the link to the updated %%MIDI documentation page?

On Sun, Nov 19, 2023, 12:53 Jean-François Moine @.***> wrote:

I added the correct PostScript definition of the turkish accidentals in the %%MIDI documentation. In fact, all about the microtone accidentals is in this page.

There are two ways for writing microtone accidentals in ABC (at least in abcm2ps, abc2svg and txtmus).

The common way is to specify a fraction of a semi-tone before the accidental, as "_23/44B". In this case, there is no notion of scale or temperament.

The command "%%MIDI temperamentequal " divides the octave into intervals. These intervals are mapped to the 12 notes of the octave for the scale to be the closest to a well tempered scale. In this case, as the microtone divider is known, only the numerator appears in the accidentals like "_2B".

Mixing both ways is not a good idea! You may also note that, with temperamentequal, an accidental without a numerator as "_B" is ambiguous.

— Reply to this email directly, view it on GitHub https://github.com/lewdlime/abcm2ps/issues/115#issuecomment-1817930447, or unsubscribe https://github.com/notifications/unsubscribe-auth/AD6AZECT6YPWE727JPX3VM3YFJBTLAVCNFSM6AAAAAA7Q7AFESVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMJXHEZTANBUG4 . You are receiving this because you authored the thread.Message ID: @.***>

timmbo9 commented 12 months ago

abc2svg MIDImoinejf.free.frTimmOn Nov 19, 2023, at 4:36 PM, topchyan @.***> wrote: Could you share the link to the updated %%MIDI documentation page?

On Sun, Nov 19, 2023, 12:53 Jean-François Moine @.***>

wrote:

I added the correct PostScript definition of the turkish accidentals

in the %%MIDI documentation. In fact, all about the microtone

accidentals is in this page.

There are two ways for writing microtone accidentals in ABC (at least in

abcm2ps, abc2svg and txtmus).

The common way is to specify a fraction of a semi-tone before the

accidental, as "_23/44B". In this case, there is no notion of scale or

temperament.

The command "%%MIDI temperamentequal " divides the octave into

intervals. These intervals are mapped to the 12 notes of the

octave for the scale to be the closest to a well tempered scale.

In this case, as the microtone divider is known, only the numerator

appears in the accidentals like "_2B".

Mixing both ways is not a good idea! You may also note that, with

temperamentequal, an accidental without a numerator as "_B" is

ambiguous.

Reply to this email directly, view it on GitHub

https://github.com/lewdlime/abcm2ps/issues/115#issuecomment-1817930447,

or unsubscribe

https://github.com/notifications/unsubscribe-auth/AD6AZECT6YPWE727JPX3VM3YFJBTLAVCNFSM6AAAAAA7Q7AFESVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMYTQMJXHEZTANBUG4

.

You are receiving this because you authored the thread.Message ID:

@.***>

—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you are subscribed to this thread.Message ID: @.***>

moinejf commented 12 months ago

You are right, in the documentation index, %%MIDI does not appear as being a abcm2ps parameter.    http://moinejf.free.fr/abcm2ps-doc/MIDI.html

topchyan commented 11 months ago

Jef could you please add an abc2svg equivalent of this? I am not sure how to define these in %%beginsvg..%%endsvg. Thanks!

% abcm2ps PostScript definition of the Arel - Ezgel accidentals

%%beginps
/sbar {M -4 6 RM 5 2 RL 1 SLW stroke}!
/hbar {M -3 -1.5 RM 7 3 RL 1.6 SLW stroke}!
/num2 {M 2.0 6.0 RM /Times-Roman 10 selectfont (2) show}!
/num3 {M 4.0 6.0 RM /Times-Roman 10 selectfont (3) show}!

/ft15156 {ft0}! % _60/53 - _5
/ft12084 {2 copy ft0 sbar}! % _48/53 - _4
/ft9012 {2 copy ft0 2 copy num3 sbar}! % _36/53 - _3
/ft5940 {2 copy ft1 num2}! % _24/53 - _2
/ft2868 {ft1}! % _12/53 - _1

/sh2868 {sh1}! % ^12/53 - ^1
/sh5940 {2 copy sh1 num2}! % ^24/53 - ^2
/sh9012 {2 copy sh0 num3}! % ^36/53 - ^3
/sh12084 {sh0}! % ^48/53 - ^4
/sh15156 {2 copy gsave T 0 0 1.2 dup scale sh1 grestore hbar}! % ^60/53 - ^5
%%endps

X:3
%%MIDI temperamentequal 53
M:none
L:1/4
K:C
_B _5B _4B _3B _2B _1B =B | =c ^1c ^2c ^3c ^4c ^5c ^c |
moinejf commented 11 months ago

That's simple: just remove the %%beginps..%%endps sequence! (the definition of the Arel - Ezgel accidentals are included by the command "%%MIDI temperamentequal 53" - I updated the documentation)

topchyan commented 1 month ago

I'm working on this classical Turkish score by Armenian Ottoman composer Nigoğos Ağa Taşçıyan (1836-1885). The PDF seems to render correctly. However, MIDI playback just doesn't sound right (I can't attach the MIDI file here because it is unsupported by GitHub).

Akşam olur güneş gider şimdi buradan - Hicâzkâr Şarkı.pdf

The abcnotation is as follows:

`%%beginps /micronewps /sbar {M -3.0 4.0 rmoveto 4.0 4.3 rlineto stroke}! /hbar {M -3.0 -1.0 rmoveto 6.0 1.5 rlineto stroke}! /sh2055 {2 copy ft1 hbar}! %_9/8 /ft1543 {2 copy ft0 sbar}! %_7/8 /ft515 {2 copy ft1543 }! %_3/4 /ft259 {2 copy ft3 }! %_2/4 /ft3 {gsave -1 1 scale exch neg exch ft0 grestore}! %^1/4 /sh3 {2 copy sh1 }! %^1/4 /sh259 {2 copy sh1 }! %^2/4 /sh515 {2 copy sh0 }! %^3/4 /sh1543 {2 copy sh0 sbar}! %^7/8 /sh2055 {2 copy sh1 hbar}! %^9/8 %%endps

X:93 T:Akşam olur güneş gider şimdi buradan T:Hicâzkâr Şarkı C:Nigoğos Ağa Taşçıyan (1836-1885) F:https://www.youtube.com/watch?v=X9mfhSwMU2M M:9/8 L:1/8 Q:1/8=210 R:Aksak K:G _/B _3/4e _3/4A %%MIDI tuningsystem comma53 %%%MIDI temperamentequal 53 S f2 g g g2 g3 | =a2 _b a gf _3/4ed c | d2 e d c2 _b=a g | f g3 gf ed c | d2 e d c2 e/d/c c | c3 G _3/4AB c2 B/d/ |: c2 d _2/4e =f2 g3 | d2 e>d cd BA G | d>c c>B B>A BA A/G/ |1 G =f2 _2/4e/d/ d/c/c/B/ c2 B/d/ :|2 G3 d/e/ d/c/c/B/ c2 B/d/ || c2 d e d/c/c/B c3 | D2 e {f}e/d/ d/c/c/B/ c3 | d2 e d c2 _b=a g | f g3 gf ed c | d2 ed c2 gf e | c3 G AB c2 B/d/ | c2 d _2/4e =f2 g3 | d2 e>d cd BA G | d>c c>B B>A BA A/G/ |1 G =f2 _2/4e/d/ d/c/c/B/ c2 B/d/ : |2 G3 d/e/ d/c/B/A/ G3 ||: g/f/g/a/ g d e/d/e/f/ g/f/e/d/ c | g/f/g/a/ g d e/d/e/f/ g2 z | g/f/g/a/ g d e/d/e/f/ g/f/e/d/ c |1,3 B/c/d/e/ d/c/ c/B/ B/A/A/G/ G2 z :|2 B/c/d/e/ d/c/ c/B/ B/A/A/G/ Gd e/Sf/ || % W:1.Akşam olur güneş gider şimdi buradan W:Garip garip kaval çalar çoban dereden W:Pek körpesin esirgesin seni yaradan W:Sonra yârdan ayrılırsın, gel yavrucağım W: W:2.Dağları duman bürüdü, ağyar seçilmez W:Avcı Yolda tuzak kurmuş, bir yâre geçirmez W:Vefasızın Meclisinde Bade içilmez W:Gir sürüye kurt kapmasın, gel yavrucağım`

My observations are such that microtone accidentals stated in key signature are not honored in MIDI playback , however when the accidentals are forced as in the note _3/4e in measure 2 and _3/4A in measure 6 then the playback is close to what's expected (although I would like to know how to tweak the pitches in the configuration to make them sound right).

Since I am using EasyABC which does not (and probably will not) support abc2svg and is limited to abcm2ps for the foreseeable future and a very large number of similar scores are in existance (SymbTr project), I guess the expectation is that abcm2ps should probably support these microtone accidentals when used as key signatures. I know that abcjs library already does that but it also lacks flexibility of rendering needed symbols -- postscript commands now seem the most viable option that exists.

Lastly, I attempted to MIDI temperamentequal 53 command in place of %%MIDI tuningsystem comma53 to see if this would enable the better rendering of the sound usign Arel-Ezgel, but then the score did not engrave at all.

Thank you for your attention!

moinejf commented 1 month ago

Hi Avetik, abcm2ps is music typesetter. It does not play any music. For playing, I think that EasyABC uses abcMIDI (https://abcmidi.sourceforge.io/).

About the MIDI commands in abcm2ps, only %%MIDI temperamentequal 53 is handled. When this command is used, the accidentals in the source are in the form ^1 ^2 ^3 ... _1 _2 _3 ... and, indeed, the definition of these accidentals must be present at generation time for correct rendering (see above in this github issue).