如何在PostScript中迭代数组数组?如何使用带有音乐符号的字体?

时间:2014-10-10 12:40:00

标签: fonts 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, BravuraGonville等字体(甚至是songs package中使用的字体)

此处的任何指示都将受到赞赏。

非常感谢。

Obs。:字符串数组是最适合该作业的数据结构吗?它像最简单和最直接的一样接近我。如果您是执行此程序的人,您会使用其他数据结构吗?

2 个答案:

答案 0 :(得分:2)

我认为你期望moveto是相对的,它不是,它指定了页面上的绝对位置。所以你的外循环移动到50,0然后你的内循环移动到50,0(这是相同的位置)并绘制字符串。然后旋转30度,移动到50,0,再次移动到50,0,依此类推。您将立即注意到的与您的第一个代码片段相同,这就是您获得相同输出的原因。

如果你想要相对移动,那么你需要做rmoveto而不是moveto。

当然,我完全有可能误解你想要达到的目标......

至于使用字体,根据您的使用情况,有几种方法;

您可以将字体安装到解释器,然后只需像为Times-Roman那样调用字体。

您可以在PostScript文件中嵌入字体并执行完全相同的操作,但在这种情况下,您可以将PostScript文件发送给没有字体但仍能正确打印的人。

如果字体是1型字体,那么您可以直接嵌入它们。注意:看看其中一个包我注意到它包含.pfb文件(打印机字体二进制文件),你不能直接使用它,你需要解码它们。您根本不能直接使用TrueType(或OpenType)字体,它们需要转换为42字体(或者在带有CFF轮廓的OpenType字体的情况下转换为类型2字体)。

我不完全确定你要做什么,所以很难批评你的方法。请注意,我的音乐知识基本上是零,这可能没有帮助.....

答案 1 :(得分: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

此代码已经过测试,字体必须缩小到适合页面。