memo/20120419
created 2012-04-19 modified 2012-04-24
cairoでギターフォームの図、とりあえずできた。

後述のソースのうち、重要なのは
Python ソースコード
↓4/24 英語のつづり間違ってるかも!
下記、参考にさせていただきました。ありがとうございます。
2012 4/20
あああっ margine じゃなくて !!margin だろが俺のバカ。
だから嫌なんだよ!
→なおしました...
そしてさらに
flet じゃなくて fret です。OTL
→なおしました...

後述のソースのうち、重要なのは
frets = 4
leftmost_fret = 3
pos = [2, 2, 1, None, 2, None]
の部分だけなので、この部分だけを指定すれば、上記のような図をWikiに埋め込めるようにしたい訳です。それをこれから考えて行きます。Python ソースコード
↓4/24 英語のつづり間違ってるかも!
#!/usr/bin/env python
#coding:utf-8
import cairo
import math
def main():
sf_w = 200
sf_h = 150
margin_x = 20
margin_y = 20
margin_fb_and_num = 20
margin_fret_num_h = 5
strings = 6
frets = 4
leftmost_fret = 3
pos = [2, 2, 1, None, 2, None]
#下地
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, sf_w, sf_h)
cx = cairo.Context(surface)
cx.set_source_rgb(1.0, 1.0, 1.0)
cx.rectangle(0, 0, sf_w, sf_h) #左上 x y と 幅 高さ
cx.fill()
#マス
cx.set_source_rgb(0.0, 0.0, 0.0)
fb_x0 = margin_x
fb_y0 = margin_y
fb_x1 = sf_w - margin_x
fb_y1 = sf_h - margin_y - margin_fret_num_h - margin_fb_and_num
frets_interval_x = (fb_x1 - fb_x0) / frets
strings_interval_y = (fb_y1 - fb_y0) / (strings-1)
fb_x_seq = range(fb_x0, fb_x1, frets_interval_x)
fb_x_seq.append(fb_x1)
fb_y_seq = range(fb_y0, fb_y1, strings_interval_y)
fb_y_seq.append(fb_y1)
for px in fb_x_seq:
cx.move_to(px, fb_y0)
cx.line_to(px, fb_y1)
for py in fb_y_seq:
cx.move_to(fb_x0, py)
cx.line_to(fb_x1, py)
cx.stroke()
#抑えるところマーク
for i in range(6):
if not pos[i] is None:
pos_x = (pos[i] - 0.5) * frets_interval_x + fb_x0
pos_y = fb_y_seq[i]
pos_r = strings_interval_y * 0.4
cx.arc(pos_x, pos_y, pos_r, 0, 2*math.pi)
cx.fill()
#フレット番号
cx.select_font_face(
"monospace", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
cx.set_font_size(14)
font_x_bearing, font_y_bearing, font_width, font_height = \
cx.text_extents("8")[:4]
fretnum_y = sf_h - margin_y - margin_fret_num_h
fret_nums = range(leftmost_fret + 1, leftmost_fret + 1 + frets)
for i in range(frets):
fretnum_x = (i + 0.5) * frets_interval_x + fb_x0
cx.move_to(fretnum_x - font_width/2 - font_x_bearing,
fretnum_y - font_height/2 - font_y_bearing)
cx.show_text("%d" % fret_nums[i])
surface.write_to_png("test2-line.png")
return
main()
下記、参考にさせていただきました。ありがとうございます。
| リンク | 備考 |
|---|---|
| 画像処理についてあれこれ - pycairoのまとめ | |
| Cairo Tutorial for Python Programmers |
2012 4/20
あああっ margine じゃなくて !!margin だろが俺のバカ。
だから嫌なんだよ!
→なおしました...
そしてさらに
flet じゃなくて fret です。OTL
→なおしました...