2014-10-10 2 views
1

Я боролся с какой-то код PostScript, и я немного достичь своей цели по малу (язык PostScript это действительно круто!)Как перебирать массив массивов в PostScript? Как использовать шрифт с музыкальными знаками?

То, что я до сих пор:

%!PS-Adobe-2.0 
/Times-Roman findfont 20 scalefont setfont 
/r 360 12/def 

/triades [ 
(C Dm Em F G Am Bmb5) 
(F Gm Am Bb C Dm Emb5) 
(Bb Cm Dm Eb F Gm Amb5) 
(Eb Fm Gm Ab Bb Cm Dmb5) 
(Ab Bbm Cm Db Eb Fm Gmb5) 
(Db Ebm Fm Gb Ab Bbm Cmb5) 
(F# G#m A#m B C# D#m E#mb5) 
(B C#m D#m E F# G#m A#mb5) 
(E F#m G#m A B C#m D#mb5) 
(A Bm C#m D E F#m G#mb5) 
(D Em F#m G A Bm C#mb5) 
(G Am Bm C D Em F#b5) 
] def 

336 396 translate 
triades { 50 0 moveto show 30 rotate } forall 
showpage 

Это дает мне страница с 12 последовательностями аккордов, распространяющимися по кругу. Но есть проблема с этим подходом: он делает автоматический интервал, поэтому линия, в которой у многих хорд есть #, линия становится больше, а аккорды более удалены друг от друга. Я попытался сделать вложенный цикл, печатая chors один за другим, но это действительно не сработало. Вот что я пробовал:

%!PS-Adobe-2.0 
/Times-Roman findfont 20 scalefont setfont 
/r 360 12/def 

/triadesArr [ 
[(C Dm Em F G Am Bmb5)] 
[(F Gm Am Bb C Dm Emb5)] 
[(Bb Cm Dm Eb F Gm Amb5)] 
[(Eb Fm Gm Ab Bb Cm Dmb5)] 
[(Ab Bbm Cm Db Eb Fm Gmb5)] 
[(Db Ebm Fm Gb Ab Bbm Cmb5)] 
[(F# G#m A#m B C# D#m E#mb5)] 
[(B C#m D#m E F# G#m A#mb5)] 
[(E F#m G#m A B C#m D#mb5)] 
[(A Bm C#m D E F#m G#mb5)] 
[(D Em F#m G A Bm C#mb5)] 
[(G Am Bm C D Em F#b5)] 
] def 

336 396 translate 
triadesArr { 50 0 moveto { 50 0 moveto show } forall 30 rotate } forall 

showpage 

По какой-то причине оба выхода одинаковы. Как я могу это исправить?


Есть еще одна тема: как использовать шрифт с музыкальными знаками с ним? Я хотел, чтобы аккорды, такие как Bbm, имели фактический плоский знак, а не b. Я попытался загрузить и использовать шрифты, такие как Feta, Bravura или Gonville (или даже шрифт, используемый в songs package)

Любые направления здесь будут оценены.

спасибо.

Обвод: массив массивов наиболее подходящей структуры данных для работы? Он сочлен для меня, как самый простой и разборчивый. Если бы вы делали эту программу, вы бы использовали другую структуру данных?

ответ

2

Я думаю, вы ожидаете, что moveto будет относительным, это не так, он указывает абсолютную позицию на странице. Таким образом, ваш внешний цикл перемещается на 50,0, тогда ваш внутренний цикл перемещается до 50,0 (что является одним и тем же местом) и рисует строку. Затем вы поворачиваете на 30 градусов, переходите на 50,0, снова переключаетесь на 50,0 и так далее. Это, как вы сразу заметите, совпадает с вашим первым фрагментом кода, поэтому вы получаете тот же результат.

Если вы хотите относительное moveto, тогда вам нужно сделать rmoveto вместо moveto.

Конечно, его вполне возможно, я недоразумение, что вы хотите достичь .....

Что касается использования шрифта Есть несколько способов, в зависимости от того, что вы используете;

Вы можете установить шрифт в интерпретатор, а затем просто вызвать шрифт так же, как и для Times-Roman.

Вы можете встроить шрифт в файл PostScript и сделать то же самое, но в этом случае вы можете отправить файл PostScript тем, у кого нет шрифтов, и он будет печатать правильно.

Если шрифты являются шрифтами 1-го типа, вы можете вставлять их напрямую. ПРИМЕЧАНИЕ. Если посмотреть на один из этих пакетов, я заметил, что он содержит файлы .pfb (Printer Font Binary), которые вы не можете использовать напрямую, вам необходимо их декодировать. Вы не можете напрямую использовать шрифты TrueType (или OpenType), их нужно преобразовать в шрифты типа 42 (или в случае шрифта OpenType с контурами CFF, шрифту типа 2).

Я не совсем уверен, что вы пытаетесь сделать, поэтому его трудно критиковать ваш подход.Обратите внимание, что мои музыкальные знания в основном ноль, что, вероятно, не помогает .....

0

Я думаю, ваша проблема в том, что вы пытались получить ноты с определенным радиусом для каждой строки. Это означало, что каждая нота должна быть отдельная строка и каждый аккорд должен быть повернут и перезапущена следующим образом:

%!PS-Adobe-2.0 
/Times-Roman findfont 12 scalefont setfont 
/r 360 12/def 

/triadesArr [ 
[(C) (Dm) (Em) (F) (G) (Am) (Bmb5)] 
[(F) (Gm) (Am) (Bb) (C) (Dm) (Emb5)] 
[(Bb) (Cm) (Dm) (Eb) (F) (Gm) (Amb5)] 
[(Eb) (Fm) (Gm) (Ab) (Bb) (Cm) (Dmb5)] 
[(Ab) (Bbm) (Cm) (Db) (Eb) (Fm) (Gmb5)] 
[(Db) (Ebm) (Fm) (Gb) (Ab) (Bbm) (Cmb5)] 
[(F#) (G#m) (A#m) (B) (C#) (D#m) (E#mb5)] 
[(B) (C#m) (D#m) (E) (F#) (G#m) (A#mb5)] 
[(E) (F#m) (G#m) (A) (B) (C#m) (D#mb5)] 
[(A) (Bm) (C#m) (D) (E) (F#m) (G#mb5)] 
[(D) (Em) (F#m) (G) (A) (Bm) (C#mb5)] 
[(G) (Am) (Bm) (C) (D) (Em) (F#b5)] 
] def 

336 396 translate 
triadesArr { 50 0 moveto { 10 0 rmoveto show } forall 30 rotate } forall 

showpage 

Этот код был проверен и шрифт должен был быть уменьшен, чтобы поместиться на странице.