投稿

Python会〜タートルグラフィックスで幾何学模様を作ったよ。

はじめに

前回の内容はこちら:Python〜ev3とVSCodeで音楽作り

Pythonのタートルグラフィックスで幾何学模様を作ってみました。タートルグラフィックスは画面上に表示される亀を移動させることで、亀の動いた跡が線として描かれます。1967年にLOGO言語とともに登場し、プログラムの結果をすぐに目で見て確認できるため、理解しやすく、プログラミング教育でもよく使われています。
今回は、このタートルグラフィックスにフィボナッチ数列を使うことで、幾何学模様を簡単に作る方法を紹介します。

今回、参加した子達が作った幾何学模様

目次

1.タートルグラフィックスを使った基本的な図形の書き方
2.フィボナッチ数列について
3.フィボナッチ数列を使った幾何学模様の書き方

1.タートルグラフィックスを使った基本的な図形の書き方

エディターはVsCodeを使用しています。まずは、タートルグラフィックスで基本的な図形の書き方として、円を描いてみましょう。コメントアウトで説明しています。

from turtle import * #タートルグラフィックスを使えるようにする
color('red') #ペンの色
pensize(2) #ペンの太さ
speed(0) #描くスピード 0が一番速い

#円の描き方
begin_fill() #塗りつぶしスタート
circle(50) #半径50の円を描く
end_fill() #塗りつぶし終わり
done() #処理が終わっても表示させる

circle()内の数字を変えることで円の大きさが変わります。また、塗りつぶしをしない場合は、begin_fill()とend_fill()をコメントアウトするか削除してください。
三角形の場合は、亀が100前に進み、進行方向から120度左に向きを変えるという動作を3回繰り返すことで描くことが出来ます。

#三角形の描き方
color('pink')
begin_fill()
for i in range(3): #3回繰り返す
    forward(100) #前に100進む
    left(120) #左に120度曲がる 
end_fill()
done()

三角形と同じ要領で、他の多角形も描いてみましょう。四角形なら、下のコードのXを4に置き換えます。

#多角形の描き方
color('pink')
begin_fill()
for i in range(X): #xに描きたい辺の数を入力
    forward(100) #前に100進む
    right(360/X) 
end_fill()
done()

Xに9を入れた場合は、9角形が出来ます。

多角形が作れたら、
right(360/X)の行を、right(360/X*n)にして、nに整数を入れてみると、どんな図形になるか色々実行してみよう。例えば、X=5,n=2にすると、下のような星の形になります。

2.フィボナッチ数列について

フィボナッチ数列は、1,1,2,3,5,8,13,21,34,55,89,144,233,……といったように、最初の二つの1をのぞいて、三つ目以降は、前の二つの数を足した数で出来た数列です。このフィボナッチ数列は不思議と自然界に深く関係しています。例えば、ひまわりのタネの並び方や、オウムガイやDNAの螺旋構造、木の枝の別れ方などにもフィボナッチ数列やフィボナッチ数が出現します。また、私たちが美しいと感じる黄金比にも関係しているという神秘的な数列です。

まず、フィボナッチ数列のリストを作ってみます。フィボナッチ数は前の二つの数字の和になるという特徴を利用します。ここでは、6回繰り返しているので、1,1,2,3,5,8,13,21,34,55,89,144,233,377の数列が完成します。

a=1
b=1
fibonacci=[1,1] #fibonacciという名前のリストに1と1が入っている
for i in range(6):#6回繰り返す
a +b = a #aの値にbの値を足してaの値を更新
b +a = b #bの値にaの値を足してbの値を更新
fibonacci.append(a) #aの値をfibonacciリストに追加
fibonacci.append(b) #bの値をfibonacciリストに追加

3.フィボナッチ数列を使った幾何学模様の書き方

先ほど作ったfibonacciリストを使って幾何学模様を描いてみましょう。fibonacci数列のリストを作った後に、fibo_circleという関数を作り、パラメーターを設定します。

from turtle import*
a=1
b=1
fibonacci=[1,1]

for i in range(6):
  a = a+b
  b = b+a
  fibonacci.append(a)
  fibonacci.append(b)

def fibo_circle(iro,muki,okisa,kakudo,hane,hen):#fibo_circleという名前の関数を作る。
  for i in range(hane):#羽の数だけ繰り返す
    for j in fibonacci:#fibonacciに入っている数で繰り返す
      pencolor(iro)#ペンの色
      pensize(2)#ペンの太さ
      circle(j/okisa,kakudo*muki,hen)
    speed(0)
    penup()#ペンを上にあげる
    home()#ペンの位置をホームに戻す
    pendown()#ペンを下に下げる
    rt(360/hane*(i+1))
fibo_circle('skyblue',1,4,270,8,12) #パラメータに好きな値を入力する。この場合は、色=skyblue, muki=反時計回り,okisa=4,kakudo=270度,hane = 8,hen = 12となっている

fibo_circle(iro,muki,okisa,kakudo,hane,hen)のパラメーターの解説

iro ペンの色
muki -1 = 時計回りに動く、 1 =反時計回りに動く
okisa 小さくすると描かれる図形が大きくなります
kakudo 描く円弧の大きさ

↑kakudo による図形の違い

hane 何回、同じパターンを繰り返すか

↑hane の数による図形の違い

hen 多角形の形。henのパラメーターを入れない場合は、円形になる。その場合は、def fibo_circle(iro,muki,okisa,kakudo,hane,hen):の行から、henを削除する。

↑hen の数による図形の違い

あとは、fibo_circle()の中の各パラメータに好きな値を設定するだけで、様々な模様が描けます。

pythonする会

Python〜ev3とVSCodeで音楽作り

小学6年生と中学生を対象にlegoのマインドストームev3とPythonを使って遊ぶ会<Pythonする会>を開催しました。

第一回目は、<音楽>がテーマ!

みんなで、それぞれ、メロディを作って、それを繋げ合わせて、一つの大きな曲を作ろう、というもの。小学校でも音楽の時間にやる節づくりのアレンジです。

みんな揃ったところで、名前と学年、参加した理由を一言ずつ自己紹介。

自己紹介からスタート

Pythonが全く初めての子から、Pythonに興味があって触ってみたいと思っていたという子も。


<Python会について>
Pythonする会は、実社会の様々なサービスで使われているPythonを、子供たちと色々なアプローチで使ってみよう、と企画しています。

こんな事がプログラミングで出来るんだ!を、実際に体験する事で、じゃぁ、こんな事も実現できるのでは?というアイデアや、こんな事をやりたい!といった気持ちの芽みたいなものが、うまれてくれるといいなぁ、と。

みんなの関心も様々。得意な事をお互いに教え合ったり、興味あることに出会ったら、もっと深掘りしていく、そんな場になればいいなと思っています。

まずは3回の予定で実験的に行い、より良い形を探していこうと思っています。

<プログラミグ言語Pythonについて>

曲作りに入る前に、プログラミング言語とは、そもそも何?Pythonとは?という話から始めました。簡単にいうと、プログラミング言語は、人間もコンピューターも理解できる言葉のこと。

私たちは、普段、人に何かを伝えたり、また、表現したりといったコミュニケーションを<言葉>を使ってしますよね。その言葉は、日本語であったり、英語であってり、中国語であったり、住んでいる国や相手によって、様々な言語があり、お互いに意思疎通が成り立つ言語を使って、コミュニケーションをおこなっています。

一方、機械であるコンピューターは、情報をスイッチのON/OFFの二通りでのみ受け取ります。そのため、コンピューターが理解するには、伝えたい情報を2進法で表す必要があります。

コンピューターが2進法しか理解できないから、といって、私たちは、2進法でコンピューターとコミュニケーションは出来ません。いや、やろうと思ったら、出来ないことはないけど、、

Helloというのを2進法で伝える?

01001000 01100101 01101100 01101100 01101111

いやいや、考えるだけで、きっと気が遠くなっちゃうよね。

なので、人もコンピューターもお互いに理解できるプログラミング言語を使ってコミュニケーションしようということ。

人が使う言語もたくさんの種類があるのと同じで、プログラミング言語も様々な種類や特徴があって、Pythonはその一つ。

Pythonの特徴は、比較的、読みやすく、わかりやすい文法。

豊富なライブラリーがあり、機械学習やAIの開発がしやすい。

YoutubeやInstagramに使われているように、Webアプリケーションの開発も可能。

プログラミング言語とPythonの特徴をかなりざっくりと理解してもらったところで、テーマの音楽づくりに入っていきます。

<音楽のルールを知ろう>

今回は、最終的には、みんなのメロディを繋げて、一つの曲にしたいので、ある程度のルールを決めて、音楽づくりを行います。

決めたルールは次の三つだけ。

①レとソを使わない<ヨナ抜き短音階>で曲を作る。

この音階は、サクラサクラやなど、日本の童謡などでよく使われる音階です。曲に使う音階を統一すると、繋げた時に全体のまとまり感が出る。

②次の音を置くとき、その場に留まるか、隣の音に移動する。

ドの隣の音は、シかミになる。飛び飛びの音は使わない。

③4分の4拍子は変えない。

4分音符を8分音符二つに置き換えたり、16分音符四つに置き換えたりしてもいいけど、4分の4拍子は必ず維持!

音は、普段、親しんでいるドレミファソラシドでなく、英米式を使ってCDEFGABと表します。

<実際にプログラムを作ろう〜曲作り〜>

プログラミングの簡単な説明をして、まずは、サクラサクラの4小節分を雛形として使い、そこから、音符を置き換えていきます。

では、サンプルプログラム!

サクラサクラのはじめの4小節分です。エディターは、マイクロソフトの無料エディターVisual Studio Code (VSCode)を使用しています。

#!/usr/bin/env pybricks-micropython 
#micropythonでev3を使うための記載。
#vscodeでは自動的に記載される。
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile

# This program requires LEGO EV3 MicroPython v2.0 or higher.
# Click "Open user guide" on the EV3 extension tab for more information.

# Create your objects here. 
# この下にオブジェクトをかく。
ev3 = EV3Brick()

#タッチセンサー1を使えるようにする。
t1_sensor = TouchSensor(Port.S1) 
#タッチセンサー2を使えるようにする。
t2_sensor = TouchSensor(Port.S2)

# Write your program here. 
# 実際のプログラムはこの下にかく。
ev3.speaker.beep()


#サクラサクラのメロディー(4小節)
tempo = 100 #テンポを100にする。
ev3.speaker.play_notes(['A4/4','A4/4','B4/2'],tempo) 
#ラ・ラ・シー 書き方は'音・オクターブ/音の長さ'
ev3.speaker.play_notes(['A4/4','A4/4','B4/2'],tempo) 
#ラ・ラ・シー
ev3.speaker.play_notes(['A4/4','B4/4','C5/4','B4/4'],tempo)
#ラ・シ・ド・シ
ev3.speaker.play_notes(['A4/4','B4/8','B4/8','F4/2'],tempo)
#ラ・シ・ラ・ファー

まず、先ほどの音楽ルール①②を意識して、C(ド)→E(ミ)など、音だけを変えてみよう。
自分で、音を五線譜に書き込んでから、コードに写していってもいいし、やり方は自由です。
出来たらダウンロードして確認してみて、自分で、心地いい音の流れを見つけよう。

そこまで、出来たら、あとは、音符の長さを変えて、リズムを変えたり、自由に作曲。

<プログラムを作ろう〜音楽再生をタッチセンサーで制御〜>
次に、ロボットのタッチセンサーを押すと、曲が始まる、というプログラムにしました。こうする事で、自分の好きなタイミングで曲を演奏する事ができます。コードは下のwhile文を、先ほど作った音楽メロディのコードの上に付け加えるだけです。

while not t1_sensor.pressed(): #タッチセンサー1を押すまで無限ループ。
    pass


一人ずつ順番に作った曲を再生してみました。あらかじめダウンロードしておいて、自分の番になったらタッチセンサーを押すと再生されます。

今回は、ヨナ抜き短音階で作ったので、なんとなく和を感じる音楽になっていないでしょうか?

和を感じるには、ev3の電子音っぽいところが気になりますが。。

<音階を変えて曲をアレンジしよう>

では、音階を変えてみるとどうなるか?と実験してみました。

独特な響きを持つ琉球音楽は、主に<ニロ抜き長音階>を使って作られている事が多いです。THE BOOMの島唄などもそうですね。ニロ抜き長音階は、レとラを抜かしたド・ミ・ファ・ソ・シ・ドになります。先ほどの<ヨナ抜き短音階>のラをソに変えると<ニロ抜き長音階>になるので、琉球音楽っぽい雰囲気になります。

先ほど作ったコードのAをGに変えてみよう!

琉球アレンジ 音楽あわせ


どことなく琉球音楽っぽいメロディが。ただ、これもやっぱり、ev3の電子音が気になりますが。。

<まとめ>

今回は、ごく簡単なプログラムで、色々遊びました。音楽への関心度は様々だったと思いますが、楽器をやっている子も、特に音楽の知識がない子も、みんな集中して曲作りに取り組んでいました。
EV3が導入されている中学校も多いと思うので、音楽の時間にプログラミングを絡めたこんな授業があっても楽しそうです。

次回は、フィボナッチ数列を使って、綺麗な幾何学模様を作っていく予定です。

おしまい