Bashを使って、SVGで五線譜を描いてみます。
白い紙に線を描く
まずは五線譜を描くための紙となる白い四角を作ります。
~$ cat -n staff-rect.sh 1 cat <<EOL > /tmp/tmp.svg 2 <svg width="640" height="280"> 3 <rect x="0" y="0" width="640" height="280" fill="white"></rect> 4 </svg> 5 EOL 6 inkscape -z -e out.png /tmp/tmp.svg ~$
白いので背景と同化してわかりにくいですが、以下のような画像になります。
これに、一本線を引きましょう。
~$ cat -n staff-line1.sh 1 cat <<EOL > /tmp/tmp.svg 2 <svg width="640" height="280"> 3 <rect x="0" y="0" width="640" height="280" fill="white"></rect> 4 <line x1="10" y1="100" x2="1270" y2="100" stroke="black"/> 5 </svg> 6 EOL 7 inkscape -z -e out.png /tmp/tmp.svg ~$
続けて四本引いて五線にします。
~$ cat -n staff-line5.sh 1 cat <<EOL > /tmp/tmp.svg 2 <svg width="640" height="280"> 3 <rect x="0" y="0" width="640" height="280" fill="white"></rect> 4 <line x1="10" y1="100" x2="1270" y2="100" stroke="black"/> 5 <line x1="10" y1="120" x2="1270" y2="120" stroke="black"/> 6 <line x1="10" y1="140" x2="1270" y2="140" stroke="black"/> 7 <line x1="10" y1="160" x2="1270" y2="160" stroke="black"/> 8 <line x1="10" y1="180" x2="1270" y2="180" stroke="black"/> 9 </svg> 10 EOL 11 inkscape -z -e out.png /tmp/tmp.svg ~$
ドレミの位置に円を描きます。
~$ cat -n staff.sh 1 cat <<EOL > /tmp/tmp.svg 2 <svg width="640" height="280"> 3 <rect x="0" y="0" width="640" height="280" fill="white"></rect> 4 <line x1="10" y1="100" x2="1270" y2="100" stroke="black"/> 5 <line x1="10" y1="120" x2="1270" y2="120" stroke="black"/> 6 <line x1="10" y1="140" x2="1270" y2="140" stroke="black"/> 7 <line x1="10" y1="160" x2="1270" y2="160" stroke="black"/> 8 <line x1="10" y1="180" x2="1270" y2="180" stroke="black"/> 9 <circle cx="100" cy="160" r="10" fill="black" /> 10 <circle cx="140" cy="160" r="10" fill="black" /> 11 <circle cx="180" cy="150" r="10" fill="black" /> 12 </svg> 13 EOL 14 inkscape -z -e out.png /tmp/tmp.svg ~$
音階を指定して音符を描けるようにする
~$ cat -n staff.sh 1 cat <<EOL > /tmp/tmp.svg 2 <svg width="640" height="280"> 3 <rect x="0" y="0" width="640" height="280" fill="white"></rect> 4 <line x1="10" y1="100" x2="1270" y2="100" stroke="black"/> 5 <line x1="10" y1="120" x2="1270" y2="120" stroke="black"/> 6 <line x1="10" y1="140" x2="1270" y2="140" stroke="black"/> 7 <line x1="10" y1="160" x2="1270" y2="160" stroke="black"/> 8 <line x1="10" y1="180" x2="1270" y2="180" stroke="black"/> 9 <circle cx="100" cy="200" r="10" fill="black" /> 10 <circle cx="140" cy="190" r="10" fill="black" /> 11 <circle cx="180" cy="180" r="10" fill="black" /> 12 </svg> 13 EOL 14 inkscape -z -e out.png /tmp/tmp.svg
これを少しずつ改造します。
9行目の音符(circle)は、関数化しておきます。
1 line(){ 2 cat <<EOL 3 <circle cx="100" cy="200" r="10" fill="black" /> 4 EOL 5 }
ドを0として、レ=1、ミ=2、番号で音階が指定できるように修正します。
1 line(){ 2 x=100 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 cat <<EOL 6 <circle cx="$x" cy="$onkai" r="10" fill="black" /> 7 EOL 8 x=`expr $x + 40`; 9 done 10 }
ド〜ドまで表示します。
1 line(){ 2 x=100 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 cat <<EOL 6 <circle cx="$x" cy="$onkai" r="10" fill="black" /> 7 EOL 8 x=`expr $x + 40`; 9 done 10 } 11 a=`line 0 1 2 3 4 5 6 7`
音符に「ぼう」をつけてみます。5,6,9行目を追加しました。
1 line(){ 2 x=100 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 10` 6 b1=`expr $onkai - 60` 7 cat <<EOL 8 <circle cx="$x" cy="$onkai" r="10" fill="black" /> 9 <line x1="$x" y1="$b1" x2="$x" y2="$b2" stroke="black"/> 10 EOL 11 x=`expr $x + 40`; 12 done 13 }
円の代わりに楕円を使って音符に近づけます。ぼうの楕円の右端にくるようにずらします。
1 line(){ 2 x=100 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 5` 6 b1=`expr $onkai - 70` 7 bx=`expr $x + 12` 8 cat <<EOL 9 <ellipse cx="$x" cy="$onkai" rx="14" ry="9" fill="black" transform="rotate(-25,$x,$onkai)"/> 10 <line x1="$bx" y1="$b1" x2="$bx" y2="$b2" stroke="black" stroke-width="2.5"/> 11 EOL 12 x=`expr $x + 40`; 13 done 14 }
楕円を回転させて、ぼうは少し太くします。あと音符間の間隔を広げたり、いろいろ調整。
~$ cat -n staff2.sh 1 line(){ 2 x=100 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 5` 6 b1=`expr $onkai - 70` 7 bx=`expr $x + 12` 8 cat <<EOL 9 <ellipse cx="$x" cy="$onkai" rx="14" ry="9" fill="black" transform="rotate(-25,$x,$onkai)"/> 10 <line x1="$bx" y1="$b1" x2="$bx" y2="$b2" stroke="black" stroke-width="2.5"/> 11 EOL 12 x=`expr $x + 60`; 13 done 14 } 15 a=`line 0 1 2 3 4 5 6 7` 16 17 cat <<EOL > /tmp/tmp.svg 18 <svg width="640" height="280"> 19 <rect x="0" y="0" width="640" height="280" fill="white"></rect> 20 <line x1="10" y1="100" x2="1270" y2="100" stroke="black"/> 21 <line x1="10" y1="120" x2="1270" y2="120" stroke="black"/> 22 <line x1="10" y1="140" x2="1270" y2="140" stroke="black"/> 23 <line x1="10" y1="160" x2="1270" y2="160" stroke="black"/> 24 <line x1="10" y1="180" x2="1270" y2="180" stroke="black"/> 25 $a 26 </svg> 27 EOL 28 inkscape -z -e out.png /tmp/tmp.svg
ト音記号を描く
続きです。
ト音記号を描きます。
ト音記号の素材は https://azukichi.net/ からいただきました
~$ wget https://azukichi.net/img/music/onpu064.png
inkscapeを開きます。
素材をインポートします。
ペンツールで、ベジェ曲線を描いて行きます。
はみ出しても後で調整できます。
ノードツールで、位置を調整します。
リンクしている素材を削除します。
ノードツールで、微調整します。
黒く塗りつぶします。
描いたパスはテキストでこうなりました。
~$ grep d=.m G_clef.svg | fold -w80 -s id="metadata7"> d="m 56.35986,168.66933 c 0,0 -4.61429,-0.97143 -5.82857,-7.77143 -1.69321,-9.48198 10.88767,-14.08481 16.75714,-10.44286 5.0332,3.12306 5.49313,13.26802 3.15714,17.97143 -7.39019,14.87984 -32.05714,6.31429 -33.02857,-12.38571 -0.85171,-16.39547 23.31429,-34.24286 23.31429,-34.24286 15.69195,-18.14484 14.27911,-29.83344 5.1,-45.9 -9.67568,6.65963 -13.98784,17.86559 -12.87143,28.41428 0.37615,3.13466 11.41428,91.55715 11.41428,91.55715 -0.97143,1.7 0.60315,6.29524 -7.04285,9.71428 -5.75143,2.57185 -13.95304,-3.97819 -10.44286,-4.61428 2.43211,-0.44074 6.02055,-2.16783 6.55714,-7.04286 0.43495,-3.9516 -3.88571,-9.22857 -10.68571,-6.31429 -9.70669,7.11557 0.006,19.9073 12.38571,20.64286 11.15395,-1.12296 11.46971,-11.74642 11.17143,-17.00001 -0.25271,-3.70639 -10.68571,-84.02856 -10.68571,-84.02856 -0.24286,-5.1 3.59877,-18.50425 9.95714,-18.94286 3.30325,-0.22786 5.82315,8.82371 1.45714,15.78572 -8.98571,14.32857 -33.79055,29.19106 -35.21428,44.68571 -1.58507,16.3288 12.24666,29.92904 26.71428,30.35714 7.60069,-0.91625 18.84479,-6.24743 20.15714,-21.12857 0.94007,-10.65967 -8.01428,-18.21428 -19.91428,-16.75714 -2.98171,0.36511 -10.17437,4.05167 -12.14286,9.95714 -2.57761,8.56468 2.2775,14.91145 9.71429,17.48572 z"
前回のスクリプトにpath行を加えると、以下のようなスクリプトになりました。
~$ fold -w60 -s staff-f4.sh | cat -n 1 line(){ 2 x=120 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 5` 6 b1=`expr $onkai - 70` 7 bx=`expr $x + 12` 8 cat <<EOL 9 <ellipse cx="$x" cy="$onkai" rx="14" ry="9" fill="black" 10 transform="rotate(-25,$x,$onkai)"/> 11 <line x1="$bx" y1="$b1" x2="$bx" y2="$b2" stroke="black" 12 stroke-width="2.5"/> 13 EOL 14 x=`expr $x + 60`; 15 done 16 } 17 a=`line 0 1 2 3 4 5 6 7` 18 19 cat <<EOL > /tmp/tmp.svg 20 <svg width="640" height="280"> 21 <rect x="0" y="0" width="640" height="280" 22 fill="white"></rect> 23 <line x1="10" y1="100" x2="1270" y2="100" stroke="black"/> 24 <line x1="10" y1="120" x2="1270" y2="120" stroke="black"/> 25 <line x1="10" y1="140" x2="1270" y2="140" stroke="black"/> 26 <line x1="10" y1="160" x2="1270" y2="160" stroke="black"/> 27 <line x1="10" y1="180" x2="1270" y2="180" stroke="black"/> 28 <line x1="10" y1="100" x2="10" y2="180" stroke="black"/> 29 $a 30 <path stroke="black" stroke-width="1" 31 d="m 56.35986,168.66933 c 0,0 -4.61429,-0.97143 32 -5.82857,-7.77143 -1.69321,-9.48198 10.88767,-14.08481 33 16.75714,-10.44286 5.0332,3.12306 5.49313,13.26802 34 3.15714,17.97143 -7.39019,14.87984 -32.05714,6.31429 35 -33.02857,-12.38571 -0.85171,-16.39547 23.31429,-34.24286 36 23.31429,-34.24286 15.69195,-18.14484 14.27911,-29.83344 37 5.1,-45.9 -9.67568,6.65963 -13.98784,17.86559 38 -12.87143,28.41428 0.37615,3.13466 11.41428,91.55715 39 11.41428,91.55715 -0.97143,1.7 0.60315,6.29524 40 -7.04285,9.71428 -5.75143,2.57185 -13.95304,-3.97819 41 -10.44286,-4.61428 2.43211,-0.44074 6.02055,-2.16783 42 6.55714,-7.04286 0.43495,-3.9516 -3.88571,-9.22857 43 -10.68571,-6.31429 -9.70669,7.11557 0.006,19.9073 44 12.38571,20.64286 11.15395,-1.12296 11.46971,-11.74642 45 11.17143,-17.00001 -0.25271,-3.70639 -10.68571,-84.02856 46 -10.68571,-84.02856 -0.24286,-5.1 3.59877,-18.50425 47 9.95714,-18.94286 3.30325,-0.22786 5.82315,8.82371 48 1.45714,15.78572 -8.98571,14.32857 -33.79055,29.19106 49 -35.21428,44.68571 -1.58507,16.3288 12.24666,29.92904 50 26.71428,30.35714 7.60069,-0.91625 18.84479,-6.24743 51 20.15714,-21.12857 0.94007,-10.65967 -8.01428,-18.21428 52 -19.91428,-16.75714 -2.98171,0.36511 -10.17437,4.05167 53 -12.14286,9.95714 -2.57761,8.56468 2.2775,14.91145 54 9.71429,17.48572 z" 55 /> 56 57 </svg> 58 EOL 59 inkscape -z -e out.png /tmp/tmp.svg
ドの音に土星の輪を付ける
ドの音符に、横棒がないので、つけます。
あと関数名がlineでしたが、名前が変なので、onpuにします。
元関数
1 line(){ 2 x=120 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 5` 6 b1=`expr $onkai - 70` 7 bx=`expr $x + 12` 8 cat <<EOL 9 <ellipse cx="$x" cy="$onkai" rx="14" ry="9" fill="black" transform="rotate(-25,$x,$onkai)"/> 10 <line x1="$bx" y1="$b1" x2="$bx" y2="$b2" stroke="black" stroke-width="2.5"/> 11 EOL 12 x=`expr $x + 60`; 13 done 14 }
修正後。1,18行目を修正。8,9,13行目を増やしました。
1 onpu(){ 2 x=120 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 5` 6 b1=`expr $onkai - 70` 7 bx=`expr $x + 12` 8 barx1=`expr $x - 20` 9 barx2=`expr $x + 20` 10 cat <<EOL 11 <ellipse cx="$x" cy="$onkai" rx="14" ry="9" fill="black" transform="rotate(-25,$x,$onkai)"/> 12 <line x1="$bx" y1="$b1" x2="$bx" y2="$b2" stroke="black" stroke-width="2.5"/> 13 <line x1="$barx1" y1="$onkai" x2="$barx2" y2="$onkai" stroke="black" stroke-width="2.5"/> 14 EOL 15 x=`expr $x + 60`; 16 done 17 } 18 a=`onpu 0 1 2 3 4 5 6 7`
このような絵になります。
全部土星になってしまうので、条件をつけねばなりません。
横棒が必要なドは0の場合のみですので、if文(8行目)で判定します。
1 onpu(){ 2 x=120 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 5` 6 b1=`expr $onkai - 70` 7 bx=`expr $x + 12` 8 if [ $i -eq 0 ] ; then 9 barx1=`expr $x - 20` 10 barx2=`expr $x + 20` 11 dosei="<line x1=\"$barx1\" y1=\"$onkai\" x2=\"$barx2\" y2=\"$onkai\" stroke=\"black\" stroke-width=\"2.5\"/>" 12 else 13 dosei="" 14 fi 15 cat <<EOL 16 <ellipse cx="$x" cy="$onkai" rx="14" ry="9" fill="black" transform="rotate(-25,$x,$onkai)"/> 17 <line x1="$bx" y1="$b1" x2="$bx" y2="$b2" stroke="black" stroke-width="2.5"/> 18 $dosei 19 EOL 20 x=`expr $x + 60`; 21 done 22 } 23 a=`onpu 0 1 2 3 4 5 6 7`
音符の数を8個から13個に増やしてみます。
五線譜のを超えたラにも横棒が必要になるので、0以外に12も条件に含めます(8行目)
1 onpu(){ 2 x=120 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 5` 6 b1=`expr $onkai - 70` 7 bx=`expr $x + 12` 8 for j in 0 12;do 9 if [ $i -eq $j ] ; then 10 barx1=`expr $x - 20` 11 barx2=`expr $x + 20` 12 dosei="<line x1=\"$barx1\" y1=\"$onkai\" x2=\"$barx2\" y2=\"$onkai\" stroke=\"black\" stroke-width=\"2.5\"/>" 13 break 14 else 15 dosei="" 16 fi 17 done 18 cat <<EOL 19 <ellipse cx="$x" cy="$onkai" rx="14" ry="9" fill="black" transform="rotate(-25,$x,$onkai)"/> 20 <line x1="$bx" y1="$b1" x2="$bx" y2="$b2" stroke="black" stroke-width="2.5"/> 21 $dosei 22 EOL 23 x=`expr $x + 60`; 24 done 25 } 26 a=`onpu 0 1 2 3 4 5 6 7 8 9 10 11 12` 27 28 cat <<EOL > /tmp/tmp.svg 29 <svg width="1280" height="280"> 30 <rect x="0" y="0" width="1280" height="280" 31 fill="white"></rect> 32 <line x1="10" y1="100" x2="1270" y2="100" stroke="black"/> 33 <line x1="10" y1="120" x2="1270" y2="120" stroke="black"/> 34 <line x1="10" y1="140" x2="1270" y2="140" stroke="black"/> 35 <line x1="10" y1="160" x2="1270" y2="160" stroke="black"/> 36 <line x1="10" y1="180" x2="1270" y2="180" stroke="black"/> 37 <line x1="10" y1="100" x2="10" y2="180" stroke="black"/> 38 $a 39 <path stroke="black" stroke-width="1" 40 d="m 56.35986,168.66933 c 0,0 -4.61429,-0.97143 41 -5.82857,-7.77143 -1.69321,-9.48198 10.88767,-14.08481 42 16.75714,-10.44286 5.0332,3.12306 5.49313,13.26802 43 3.15714,17.97143 -7.39019,14.87984 -32.05714,6.31429 44 -33.02857,-12.38571 -0.85171,-16.39547 23.31429,-34.24286 45 23.31429,-34.24286 15.69195,-18.14484 14.27911,-29.83344 46 5.1,-45.9 -9.67568,6.65963 -13.98784,17.86559 47 -12.87143,28.41428 0.37615,3.13466 11.41428,91.55715 48 11.41428,91.55715 -0.97143,1.7 0.60315,6.29524 49 -7.04285,9.71428 -5.75143,2.57185 -13.95304,-3.97819 50 -10.44286,-4.61428 2.43211,-0.44074 6.02055,-2.16783 51 6.55714,-7.04286 0.43495,-3.9516 -3.88571,-9.22857 52 -10.68571,-6.31429 -9.70669,7.11557 0.006,19.9073 53 12.38571,20.64286 11.15395,-1.12296 11.46971,-11.74642 54 11.17143,-17.00001 -0.25271,-3.70639 -10.68571,-84.02856 55 -10.68571,-84.02856 -0.24286,-5.1 3.59877,-18.50425 56 9.95714,-18.94286 3.30325,-0.22786 5.82315,8.82371 57 1.45714,15.78572 -8.98571,14.32857 -33.79055,29.19106 58 -35.21428,44.68571 -1.58507,16.3288 12.24666,29.92904 59 26.71428,30.35714 7.60069,-0.91625 18.84479,-6.24743 60 20.15714,-21.12857 0.94007,-10.65967 -8.01428,-18.21428 61 -19.91428,-16.75714 -2.98171,0.36511 -10.17437,4.05167 62 -12.14286,9.95714 -2.57761,8.56468 2.2775,14.91145 63 9.71429,17.48572 z" 64 /> 65 66 </svg> 67 EOL 68 inkscape -z -e out.png /tmp/tmp.svg
大譜表を描く
大譜表を描くスクリプトです。
ヘ音記号は、inkscapeを使って手で描きました。
1 onpu(){ 2 x=120 3 for i in $@;do 4 onkai=`expr 200 - $i \* 10` 5 b2=`expr $onkai - 5` 6 b1=`expr $onkai - 70` 7 bx=`expr $x + 12` 8 for j in 0 12;do 9 if [ $i -eq $j ] ; then 10 barx1=`expr $x - 20` 11 barx2=`expr $x + 20` 12 dosei="<line x1=\"$barx1\" y1=\"$onkai\" x2=\"$barx2\" y2=\"$onkai\" stroke=\"black\" stroke-width=\"2.5\"/>" 13 break 14 else 15 dosei="" 16 fi 17 done 18 cat <<EOL 19 <ellipse cx="$x" cy="$onkai" rx="14" ry="9" fill="black" transform="rotate(-25,$x,$onkai)"/> 20 <line x1="$bx" y1="$b1" x2="$bx" y2="$b2" stroke="black" stroke-width="2.5"/> 21 $dosei 22 EOL 23 x=`expr $x + 60`; 24 done 25 } 26 a=`onpu 0 1 2 3 4 5 6 7 8 9 10 11 12` 27 28 cat <<EOL > /tmp/tmp.svg 29 <svg width="980" height="400"> 30 <rect x="0" y="0" width="1280" height="400" 31 fill="white"></rect> 32 <line x1="10" y1="100" x2="1270" y2="100" stroke="black"/> 33 <line x1="10" y1="120" x2="1270" y2="120" stroke="black"/> 34 <line x1="10" y1="140" x2="1270" y2="140" stroke="black"/> 35 <line x1="10" y1="160" x2="1270" y2="160" stroke="black"/> 36 <line x1="10" y1="180" x2="1270" y2="180" stroke="black"/> 37 38 <line x1="10" y1="300" x2="1270" y2="300" stroke="black"/> 39 <line x1="10" y1="320" x2="1270" y2="320" stroke="black"/> 40 <line x1="10" y1="340" x2="1270" y2="340" stroke="black"/> 41 <line x1="10" y1="360" x2="1270" y2="360" stroke="black"/> 42 <line x1="10" y1="380" x2="1270" y2="380" stroke="black"/> 43 <line x1="10" y1="100" x2="10" y2="380" stroke="black"/> 44 $a 45 46 <path stroke="black" stroke-width="1" 47 d="m 56.35986,168.66933 c 0,0 -4.61429,-0.97143 48 -5.82857,-7.77143 -1.69321,-9.48198 10.88767,-14.08481 49 16.75714,-10.44286 5.0332,3.12306 5.49313,13.26802 50 3.15714,17.97143 -7.39019,14.87984 -32.05714,6.31429 51 -33.02857,-12.38571 -0.85171,-16.39547 23.31429,-34.24286 52 23.31429,-34.24286 15.69195,-18.14484 14.27911,-29.83344 53 5.1,-45.9 -9.67568,6.65963 -13.98784,17.86559 54 -12.87143,28.41428 0.37615,3.13466 11.41428,91.55715 55 11.41428,91.55715 -0.97143,1.7 0.60315,6.29524 56 -7.04285,9.71428 -5.75143,2.57185 -13.95304,-3.97819 57 -10.44286,-4.61428 2.43211,-0.44074 6.02055,-2.16783 58 6.55714,-7.04286 0.43495,-3.9516 -3.88571,-9.22857 59 -10.68571,-6.31429 -9.70669,7.11557 0.006,19.9073 60 12.38571,20.64286 11.15395,-1.12296 11.46971,-11.74642 61 11.17143,-17.00001 -0.25271,-3.70639 -10.68571,-84.02856 62 -10.68571,-84.02856 -0.24286,-5.1 3.59877,-18.50425 63 9.95714,-18.94286 3.30325,-0.22786 5.82315,8.82371 64 1.45714,15.78572 -8.98571,14.32857 -33.79055,29.19106 65 -35.21428,44.68571 -1.58507,16.3288 12.24666,29.92904 66 26.71428,30.35714 7.60069,-0.91625 18.84479,-6.24743 67 20.15714,-21.12857 0.94007,-10.65967 -8.01428,-18.21428 68 -19.91428,-16.75714 -2.98171,0.36511 -10.17437,4.05167 69 -12.14286,9.95714 -2.57761,8.56468 2.2775,14.91145 70 9.71429,17.48572 z" 71 /> 72 73 <path stroke="black" stroke-width="1" 74 d="m 43.037329,311.67862 c 7.993845,-3.48451 75 14.258454,5.47241 7.173963,11.06838 -6.45173,5.09616 76 -17.013942,-2.30443 -13.323075,-12.09325 4.714319,-12.50319 77 27.267029,-15.20024 35.45988,-2.86959 7.511421,11.30509 78 2.869586,23.98153 -5.329237,33.61514 -6.084824,7.14968 79 -33.061716,20.825 -33.061716,20.825 l 0,0 c 0,0 80 23.658537,-17.02074 28.552371,-29.63873 5.382081,-13.87684 81 2.578791,-29.22674 -5.534201,-30.13063 -6.058788,-0.67504 82 -13.203561,0.26772 -15.987689,6.76402 -1.844735,4.30438 83 2.049704,2.45966 2.049704,2.45966 z" 84 /> 85 86 <path stroke="black" stroke-width="1" 87 d="m 87.925847,310.03882 a 4.0994077,4.5093484 0 0 1 88 -4.063277,4.50917 4.0994077,4.5093484 0 0 1 89 -4.134902,-4.42969 4.0994077,4.5093484 0 0 1 90 3.990388,-4.58725 4.0994077,4.5093484 0 0 1 91 4.205243,4.34882" 92 /> 93 94 <path stroke="black" stroke-width="1" 95 d="m 88.130826,327.05136 a 4.0994077,4.5093484 0 0 1 96 -4.063277,4.50917 4.0994077,4.5093484 0 0 1 97 -4.134902,-4.42968 4.0994077,4.5093484 0 0 1 98 3.990388,-4.58726 4.0994077,4.5093484 0 0 1 99 4.205243,4.34882" 100 /> 101 102 </svg> 103 EOL 104 inkscape -z -e out.png /tmp/tmp.svg
46行目〜100行目が、inkscapeで描いたpathですが、小数部の桁数が大きいのでテキスト量が多くなってしまっています。
小数第一位までの数字に置換しましょう。
~$ sed -n 46,84p t.sh | perl -pe 's/([\d\.]+)/sprintf("%1.1f",$1)/ge' | tee path.txt <path stroke="black" stroke-width="1.0" d="m 56.4,168.7 c 0.0,0.0 -4.6,-1.0 -5.8,-7.8 -1.7,-9.5 10.9,-14.1 16.8,-10.4 5.0,3.1 5.5,13.3 3.2,18.0 -7.4,14.9 -32.1,6.3 -33.0,-12.4 -0.9,-16.4 23.3,-34.2 23.3,-34.2 15.7,-18.1 14.3,-29.8 5.1,-45.9 -9.7,6.7 -14.0,17.9 -12.9,28.4 0.4,3.1 11.4,91.6 11.4,91.6 -1.0,1.7 0.6,6.3 -7.0,9.7 -5.8,2.6 -14.0,-4.0 -10.4,-4.6 2.4,-0.4 6.0,-2.2 6.6,-7.0 0.4,-4.0 -3.9,-9.2 -10.7,-6.3 -9.7,7.1 0.0,19.9 12.4,20.6 11.2,-1.1 11.5,-11.7 11.2,-17.0 -0.3,-3.7 -10.7,-84.0 -10.7,-84.0 -0.2,-5.1 3.6,-18.5 10.0,-18.9 3.3,-0.2 5.8,8.8 1.5,15.8 -9.0,14.3 -33.8,29.2 -35.2,44.7 -1.6,16.3 12.2,29.9 26.7,30.4 7.6,-0.9 18.8,-6.2 20.2,-21.1 0.9,-10.7 -8.0,-18.2 -19.9,-16.8 -3.0,0.4 -10.2,4.1 -12.1,10.0 -2.6,8.6 2.3,14.9 9.7,17.5 z" /> <path stroke="black" stroke-width="1.0" d="m 43.0,311.7 c 8.0,-3.5 14.3,5.5 7.2,11.1 -6.5,5.1 -17.0,-2.3 -13.3,-12.1 4.7,-12.5 27.3,-15.2 35.5,-2.9 7.5,11.3 2.9,24.0 -5.3,33.6 -6.1,7.1 -33.1,20.8 -33.1,20.8 l 0.0,0.0 c 0.0,0.0 23.7,-17.0 28.6,-29.6 5.4,-13.9 2.6,-29.2 -5.5,-30.1 -6.1,-0.7 -13.2,0.3 -16.0,6.8 -1.8,4.3 2.0,2.5 2.0,2.5 z" /> ~$
さらに、小数点以下が0のものは、整数にします。
~$ sed 's/\.0//g' -i path.txt
~$ cat -n path.txt 1 <path stroke="black" stroke-width="1" 2 d="m 56.4,168.7 c 0,0 -4.6,-1 3 -5.8,-7.8 -1.7,-9.5 10.9,-14.1 4 16.8,-10.4 5,3.1 5.5,13.3 5 3.2,18 -7.4,14.9 -32.1,6.3 6 -33,-12.4 -0.9,-16.4 23.3,-34.2 7 23.3,-34.2 15.7,-18.1 14.3,-29.8 8 5.1,-45.9 -9.7,6.7 -14,17.9 9 -12.9,28.4 0.4,3.1 11.4,91.6 10 11.4,91.6 -1,1.7 0.6,6.3 11 -7,9.7 -5.8,2.6 -14,-4 12 -10.4,-4.6 2.4,-0.4 6,-2.2 13 6.6,-7 0.4,-4 -3.9,-9.2 14 -10.7,-6.3 -9.7,7.1 0,19.9 15 12.4,20.6 11.2,-1.1 11.5,-11.7 16 11.2,-17 -0.3,-3.7 -10.7,-84 17 -10.7,-84 -0.2,-5.1 3.6,-18.5 18 10,-18.9 3.3,-0.2 5.8,8.8 19 1.5,15.8 -9,14.3 -33.8,29.2 20 -35.2,44.7 -1.6,16.3 12.2,29.9 21 26.7,30.4 7.6,-0.9 18.8,-6.2 22 20.2,-21.1 0.9,-10.7 -8,-18.2 23 -19.9,-16.8 -3,0.4 -10.2,4.1 24 -12.1,10 -2.6,8.6 2.3,14.9 25 9.7,17.5 z" 26 /> 27 28 <path stroke="black" stroke-width="1" 29 d="m 43,311.7 c 8,-3.5 30 14.3,5.5 7.2,11.1 -6.5,5.1 31 -17,-2.3 -13.3,-12.1 4.7,-12.5 32 27.3,-15.2 35.5,-2.9 7.5,11.3 33 2.9,24 -5.3,33.6 -6.1,7.1 34 -33.1,20.8 -33.1,20.8 l 0,0 c 0,0 35 23.7,-17 28.6,-29.6 5.4,-13.9 36 2.6,-29.2 -5.5,-30.1 -6.1,-0.7 37 -13.2,0.3 -16,6.8 -1.8,4.3 38 2,2.5 2,2.5 z" 39 /> ~$
これを最初のスクリプトへ反映します。
~$ sed 46,84d t.sh > tmp.sh ~$ sed '45r path.txt' -i tmp.sh
実行してみます。
~$ . tmp.sh
実行すると、タイトルの画像が生成されます。
コメント