ロボ団泉大津校のホームページにようこそ!

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が導入されている中学校も多いと思うので、音楽の時間にプログラミングを絡めたこんな授業があっても楽しそうです。

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

おしまい