flat7th

memo/20120419

created 2012-04-19 modified 2012-04-24 

cairoでギターフォームの図、とりあえずできた。



後述のソースのうち、重要なのは

    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

→なおしました...