前回の記事では、ピアノ・ベース・ドラムの3つの楽器のタイミングを一致させて演奏するテクニックを紹介しました。
前回のプログラムでは音階と拍を1つ1つブロックに設定して縦にブロックをつないでいく作り方をしていましたが、今回はそのプログラムをリストを使った効率の良いプログラムに改良します。
リストに楽器ごとの音データを登録しておいて、プログラムの中で上から順番にリストからデータを取り出して音を出す方法です。
リストに入れる音符と拍のデータをCSVファイル(カンマ区切りのテキストファイル)で用意しておけば、そのままScratchに読み込むことができます。
楽曲は前回と同様、パブリックドメインであるアメリカ民謡の「I’ve Been Working on the Railroad(日本語の曲名:線路は続くよどこまでも)」です。
この記事を読んでいただくと、リストをつかって楽曲を演奏するプログラミングの方法が分かります。
完成品
この章の内容をご自身のScratch環境に反映すると、同じ動きを再現することができます。
完成した動き
「緑の旗でスタート」ボタンを押すと『線路は続くよどこまでも』をピアノとベースとドラムで演奏した感じの音楽が流れ始めます。
音楽が流れている間は「演奏中」のロゴが表示され、演奏が終わると消えます。
使用したスプライト
スプライトは「ネコ」「ロゴ」「ピアノ」「ベース」「ドラム」の5つです。
【ネコのスプライト】
スプライトは何でも良いのですが、Scratchで新規プロジェクトをつくると最初に登場するスプライトを使用しています。
【ロゴのスプライト】
新規にスプライトをつくって「演奏中」の文字をタイピングします。画像をベクターモードに変換して「テキスト」ツールを使うとやり易いと思います。
【ピアノのスプライト】
ピアノっぽい絵柄であれば何でも良いです。今回はScratchに標準で用意されている「Keyboard」を読み込んで使っています。
【ベースのスプライト】
ベースっぽい絵柄であれば何でも良いです。今回はScratchに標準で用意されている「Guitar-electric1」を読み込んで使っています。
【ドラムのスプライト】
ドラムっぽい絵柄であれば何でも良いです。今回はScratchに標準で用意されている「Drum Kit」を読み込んで使っています。
スプライト以外に演奏する楽曲の楽譜も必要になります。前回の記事に楽譜を示していますので参考にしてください。
完成したスクリプト
完成したスクリプトの全体です。
【ネコのスクリプト】
- i:すべてのスプライト用 or このスプライトのみ
- j:すべてのスプライト用 or このスプライトのみ
- k:すべてのスプライト用 or このスプライトのみ
- ピアノ拍計:すべてのスプライト用 or このスプライトのみ
- ベース拍計:すべてのスプライト用 or このスプライトのみ
- ドラム拍計:すべてのスプライト用 or このスプライトのみ
- ピアノ音階:すべてのスプライト用 or このスプライトのみ
- ピアノ拍:すべてのスプライト用 or このスプライトのみ
- ベース音階:すべてのスプライト用 or このスプライトのみ
- ベース拍:すべてのスプライト用 or このスプライトのみ
- ドラム音階:すべてのスプライト用 or このスプライトのみ
- ドラム拍:すべてのスプライト用 or このスプライトのみ
【ロゴのスクリプト】
前回と同じです。
【ピアノのスクリプト】
前回と同じです。
【ベースのスクリプト】
前回と同じです。
【ドラムのスクリプト】
前回と同じです。
スクリプトの作り方
ここからはプログラムを作っていく中でポイントとなる部分を説明します。
ポイント①:音階と拍を入力したCSVファイルを準備する
楽譜から音階と拍を読み取って数値に変換する方法については、前回の記事を参照してください。
CSVファイルとは、いくつかの項目(文字や数字)がカンマ(,)で区切られたテキストファイルのことです。拡張子は「.csv」にします。
たとえば、『国語算数理科社会』という文字列を教科ごとにカンマ区切りをしてCSVファイルに保存する必要がある場合、以下の形にすればOKです。なお、カンマ(,)は半角で入力する必要があります。
また、下の図の場合、最後の項目は「社会」になっていますが、この後ろにカンマ(,)をつけると最後の項目は「空白文字」という意味になります(空白の文字というのはちょっと変ですが、、、)。基本的には「一番最後にカンマはつけない」と覚えておくとよいでしょう。
それでは各楽器ごとにCSVファイルをつくっていきます。
ピアノのCSVファイル
ピアノのCSVファイルの構造は「音階,拍」としています。左から「音階の数値、カンマ、拍の数値」という並びです。
1行に1ブロック分の数値が並んでいます。これを曲の終わりまで行を追加していきます。
ベースのCSVファイル
ベースのCSVファイルの構造も「音階,拍」にしています。左から「音階の数値、カンマ、拍の数値」という並びです。
ピアノの場合と同様に1行に1ブロック分の数値が並んでいるので、これを曲の終わりまで行を追加していきます。
ドラムのCSVファイル
ドラム用のブロックは「音階と拍」を設定するのではなく、「ドラムの種類と拍」を設定するようになっているのでCSVファイルの構造も「ドラム種類,拍」になります。左から「ドラム種類の数値、カンマ、拍の数値」という並びです。
ドラム種類の選択は、プルダウンから選ぶ方法の他に数値で設定する方法があります。ただし、数値で設定する場合、変数に入れてからその変数ブロックを組み込む必要があります。
ドラム種類の数値は、プルダウンの先頭にカッコ付きで書いてある数字を指定することでできます。
また、カンマの左側(ドラム種類の数値の位置)に何も数字が入っていない行は休符を意味しているので、休符用のブロックに切り替えが必要になる箇所です。
ポイント②:CSVファイルをScratchに読み込む
各楽器のCSVファイルをつくったら、適当なフォルダに保存しておきます。
Scratchステージ上に移って、CSVファイルを読み込みたいリストの上で右クリックすると、「読み込み」と「書き出し」のメニューが表示されるので「読み込み」をクリックします。(下図の例では「ピアノ音階」リスト上で右クリック)
読み込むCSVファイルを選択して「開く」ボタンを押します。
CSVファイルに複数列のデータが存在する場合は下の図のように何列目を読み込むか指定するためのメッセージボックスが表示されますので、半角で数字を入力して「OK」ボタンを押します。
CSVファイルの1列目を読み込むと下の図のようになります。
つぎに「ピアノ拍」リストにCSVファイルの2列目を読み込むと下の図のようになります。
ベースとドラムについても同様にCSVファイルを読み込むと下の図のようになります。これでCSVファイルの読み込みは完了です。
ポイント③:リストから音階と拍を読み取ってブロックに設定する
ポイント②の最後に示した「CSVファイル読み込み完了」の図から、各楽器ごとのリストの長さが分かります。ピアノは56、ベースは32、ドラムは160ですね。
楽器ごとにリストの長さが違うので、それぞれの楽器ごとにリストから音階と拍を読み取るスクリプトをつくっていきます。
ピアノの場合
「ピアノ音階・ピアノ拍」リストに入っている値を上から順に最後まで読み取る必要があるので、まずは「~回繰り返す」ブロックで枠組みをつくります。
このとき、回数を数える変数が必要になる(このような変数をカウンター変数と言う)ので、そのための変数「i」をつくって「0」で初期化します。
言い方を変えるとこの変数「i」は、リストの何番目の要素まで読み取ったかの情報を格納しておくためのものです。
この変数「i」を繰り返し処理の中で1ずつカウントアップしていくと処理が終わった時点でリストの最後の数値、つまり「56」になっているはずです。
リストから1行ずつ読み取ったときの処理
スクリプトを組む前にリストの状態を確認します。
「ピアノ音階」リストには、所々空白(値が何も入っていない)の要素があります。これは音符ではなくて休符を表しています。
たとえば下の図の14番目の要素。一方で「ピアノ拍」リストの14番目の要素には値「1」が入っています。このことに注意してスクリプトをつくっていきます。
また、両方のリストに値が入っている要素は普通に音符を鳴らせばOKです。
もし「(ピアノ音階リストのi番目)=空白」なら、「ピアノ拍」リストから値を取り出して休符ブロックに値を設定します。
逆に「(ピアノ音階リストのi番目)=空白」でなければ、音符を鳴らすブロックにそれぞれ値を設定します。
ベースの場合
ピアノの場合と同じように「ベース音階・ベース拍」リストに入っている値を上から順に最後まで読み取るために変数「j」を用意して「~回繰り返す」ブロックで枠組みをつくります。
※変数名は他の楽器のものとは別にします。変数名を同じにすると同じ値を共有してしまいます。
この変数「j」を繰り返し処理の中で1ずつカウントアップしていくと処理が終わった時点でリストの最後の数値、つまり「32」になっているはずです。
リストから1行ずつ読み取ったときの処理
ピアノの場合とまったく同じようにスクリプトを組んでいきます。
ドラムの場合
ドラムの場合も同じように「ドラム音階・ドラム拍」リストに入っている値を上から順に最後まで読み取るために変数「k」を用意して「~回繰り返す」ブロックで枠組みをつくります。
※変数名は他の楽器のものとは別にします。変数名を同じにすると同じ値を共有してしまいます。
この変数「k」を繰り返し処理の中で1ずつカウントアップしていくと処理が終わった時点でリストの最後の数値、つまり「160」になっているはずです。
リストから1行ずつ読み取ったときの処理
ピアノの場合とまったく同じようにスクリプトを組んでいきます。
このポイント③では、それぞれの楽器ごとに具体的に説明しましたが、プログラムの構造は楽器が変わっても同じことに気が付いたでしょうか?
構造は同じで変数やリストが変わっているだけですね。ドラムだけは使うブロックも異なりますが。
ポイント④:3つの楽器の演奏タイミングを合わせる
こちらは前回の記事を参考にしてください。↓↓↓
ここまでのポイントを押さえれば、リストをつかって楽曲を演奏するためのスクリプトを完成させることができると思います。
失敗しやすいポイント
失敗しやすいポイントはありません。
応用編
今回は応用編も特にありません。
まとめ
さいごに、今回の記事で説明した『リストをつかって楽曲を演奏するプログラミング』のポイントをまとめます。
- ポイント①:音階と拍を入力したCSVファイルを準備する
- ポイント②:CSVファイルをScratchに読み込む
- ポイント③:リストから音階と拍を読み取ってブロックに設定する
- ポイント④:3つの楽器の演奏タイミングを合わせる
どうでしたか?上手く再現できたでしょうか?
他にも役に立つTips(ティップス)記事をたくさん書いてますので、ぜひ見てみてください。(記事のタイトルに「Tips」と書いていたり「Tips」タグを貼ってあります)