PICO-8でプログラミングを1から学ぶ連載、第6回です。前回はこちら。プログラミング経験者の方は、日本語マニュアルを読んで、すぐに創作にとりかかりましょう。作った作品は、ぜひ掲示板へ。
一年の計
2016年から始まったこの連載も、年をまたぎました。これまでに、画面に絵を表示したり、コントローラーでキャラクターを操作することを学びました。今年、2017年は、ひとつの2Dプラットフォーマーを作ることを目標にしたいと思います。
2Dプラットフォーマーとは、ファミコンの『スーパーマリオブラザーズ』や、PICO-8付属のデモ『Jelpi』のような、横スクロールのアクションゲームのことを指します。ジャンプしてプラットフォーム(台)を飛び跳ねていくのが楽しいゲームです。これを作るには、スクロール、ジャンプの動き、地面や物体との衝突の計算など、学ぶべきことがたくさんあります。1年かけて、これらをひとつひとつをクリアしていきましょう。これを作るための技術は、シューティングゲームやRPGなど違ったタイプのゲームを作るのに使えるはずです。
いままで、本連載でソースコードを記載する場合に、PICO-8画面での表示に合わせてすべて大文字で記載していましたが、今後はPICO-8のマニュアルに合わせて小文字で記載します。カートリッジの.p8ファイルをテキストエディターで開いた場合も、Luaコードは小文字で書かれています。
音を作ろう
さて、その第一歩として、まずは音の鳴らし方を学びましょう。効果音はゲームに説得力を与え、やりごたえがあるものにします。ゲーム制作者にとっても、音の鳴らし方を覚えることには意味があります。音が鳴っていると、鳴っていないときよりも作業が楽しくなり、捗るのです。本当です!
PICO-8には、効果音と音楽を作るための強力で使いやすいツールが備わっています。「音を作る」というと、その分野の専門家ではない人にとっては難しく聞こえるかもしれませんが、大丈夫です。PICO-8のSFX(Sound Effects=効果音)エディターは、「なんとなく」いじっても「それなり」の音が作れてしまいます。
とりあえず鳴らそう
SFXエディターがどんなものか知るために、まずはとりあえず何か音を鳴らしてみましょう。PICO-8を起動して、ESCを一回押し、右上の三角形のボタンを押すと下の画面になります。これがSFXエディターです。
真ん中の真っ黒の部分に、マウスで何か描いてみましょう。例えばこんな。
そしてスペースキーを押してみましょう。ほら、何か鳴ったでしょう。もっと違う波を描いてみましょう。例えばこんな。
そしてスペース。鳴り方が変わりましたね。次に、右上の8つのアイコンのどれかをクリックしてから波を描いてみてください。クリックしたアイコンによって、縦棒の上端のドットの色が変わります。
今度は音色が変わった!ほら、楽しいでしょう!?
SFXエディターとは
音の鳴らし方がわかったところで、このツールの中身を学んでいきましょう。実は、このSFXエディターは、効果音だけを作るものではなく、音楽のメロディーラインを作るツールを兼ねています。というと、ちょっと混乱するかもしれませんが、エディターの設定を少しいじってみると、その意味がすぐにわかります。
いま、SFXエディターの上の方にある”SPD”の値は”01″になっていると思います。これは音の再生スピードです。1~21の値をとります。値が小さいほど速く再生され、大きいほど遅く再生されます。数字の上で左クリックすると値が増え、右クリックで減ります。マウスのボタンが2個無い場合は、数字の上でドラッグしてください。右ドラッグで値が増え、左ドラッグで減ります。当初”01″だった値を”16″くらいにして、スペースを叩いてください。音楽として良いかは別にして、メロディーらしきものが聞こえるでしょう?
実は、このSFXエディターの波はいわゆる「音の波形」ではなく、むしろ楽譜に近いものです。一つ一つの縦棒はノート(=音符)であり、縦棒の高さは音の高さを表します。ここに波形を描くことは、連続した音符を置いてメロディーを作ることと同じです。電子音のメロディーを高速に再生することで、何かの音に聞こえる効果音を作ることができるのです。逆に、低速で再生した場合にはメロディーとして使用でき、これを組み合わせて曲を作ることができます。音楽エディターを使った楽曲の作り方については、また別の回にて説明する予定です。
SFXエディターの各部位について
SFXエディターの各部位について説明します。
- SFX番号: SFXの番号プログラムで呼び出すときの番号です。一つのカートリッジには、64のSFXを登録できます。
- 再生スピード: 再生スピードは前述のとおり、音の再生スピードです。最小が1、最大が21で、小さいほど速く再生します。
- ループ: 二つの値はループの開始位置と終了位置です。値を設定すると、開始位置と終了位置の間で再生がループします。(開始位置が終了位置以上の位置にいるとき、ループは起きません。)
- 音色: 8つの音色が用意されています。音色を選んで波を描くと、縦棒の先頭がその音色の色になります。
- 音程: このグラフの縦棒は、各ノート(=音符)の音程、すなわち音の高さを表します。長いほど高く、短いほど低い音で鳴ります。
- 音量: このグラフの縦棒の高さが、各ノートの音量になります。徐々に減衰するようなグラフを描いたりすると、それらしい効果音になります。
良い効果音を作るには
SFXエディターの使い方はおわかりいただけたでしょうか。さて問題は、どうしたら往年の名作ゲームのような、気持ちいいチップサウンドの効果音が作れるのか、ということです。チップチューンの専門家ではない筆者より、2つアドバイスを差し上げたいと思います。
- とにかく試す
- まねする
- n: SFX番号。-1を与えると、再生を停止。-2を与えると、ループ再生から抜ける。
- channel: 再生するチャンネル番号(0~3) (オプション、デフォルト-1)
- offset: 再生開始するノート位置(0~31) (オプション、デフォルト0)
- i: ボタン番号(0~5)
- p: プレイヤー番号(0~7) (オプション)
- ボタンが押されていない状態から押されたとき、trueを返す
- 押しっぱなしの状態が15フレーム(1フレーム=1/30秒)続いたあとは、4フレームおきにtrueを返す
- 第1回: PICO-8って何?
- 第2回: プログラムで絵を描こう
- 第3回: アニメーションを作ろう
- 第4回: コントローラーを使おう
- 第5回: 3Dグラフィックスで遊ぼう
- 第6回: 効果音を鳴らそう
- 第7回: 人と物のふれあい……衝突判定
- 第8回: 1、2、3…無限大……繰り返しとテーブル
- 第9回: ビーム、撃っちゃうね。……繰り返しとテーブルその2
- 第10回: シンギュラリティは近い……ゲームAIの初歩の初歩
- 第11回: 撃たれると痛い……衝突判定その2
- 第12回: 画面効果その1・パーティクル
いろんな音色で、いろんな波形で、音量のグラフもいじって、いろいろやってみてください。いろいろやっていくうちに、案外良い感じの音が作れてしまいます。また、この試行錯誤が楽しいものです。
「優れた芸術家は真似、偉大な芸術家は盗む」これはパブロ・ピカソの言葉です。なかなかうまく効果音が作れないときに、良い方法があります。公式掲示板の優れた作品群を参考にしましょう。ご存知のとおり、掲示板にアップロードされているカートリッジは、すべてダウンロードして中身を見ることができるのです。コードやスプライトにもいえることですが、効果音の波の形も直接見れます。ダウンロード方法については、第2回のSPLOREの説明を参考にしてください。
プログラムで音を鳴らす
音が作れたら、これをゲームの中で鳴らす方法を覚えましょう。これはとても簡単で、sfx()という関数に、作った効果音の番号を与えるだけです。ただし、_update()が用意された状態でないと再生されません。
sfx(n, [channel, [offset]])
※ PICO-8が同時に再生できる音声は4つまで=4チャンネルあります。チャンネル番号を指定しない場合は、使用していないチャンネルが自動的に選択されます(channelに-1を与えた場合も同じ)。なお、PICO-8はモノラル再生しかできません。このチャンネルとはスピーカーのチャンネルではないので、振り分けても立体音響にはなりません。
以下は、簡単な効果音再生のサンプルコードです。上下左右のキーにそれぞれ別の効果音を振り分けてあります。
function _init() last_sound=-1 end function _update() local sound=-1 if btnp(0) then sound=0 end if btnp(1) then sound=1 end if btnp(2) then sound=2 end if btnp(3) then sound=3 end if sound>-1 then sfx(sound) last_sound=sound end end function _draw() rectfill(0,0,127,127,0) -- 前回再生されたSFX番号を画面に表示する if last_sound>-1 then print("sfx "..last_sound,0,1,7) end end
0~3番のSFXを用意して、試してみてください。なお、このコードにはまだ説明していない関数があります。
btnp(i, [p])
これはbtn()と似て非なる関数で、
というものです。この関数は、ボタンが押され始めたタイミングを知りたい場合に使えます。上記のコードのbtnp()の箇所をbtn()に変えてみると、ちょっとキーを押しただけで、効果音が高速に連続で再生されてしまいます。
音の書き出し
PICO-8で作った効果音は、WAVファイルに書き出すことができます。楽曲制作や、ほかのツールで作るゲームの効果音などにも利用できますね。やり方は、SFXエディターで書き出したいSFXを開いた状態で、ESCキーでコマンドモードにして、
export("blah.wav")
と打ち込んでください。blahの部分はお好きな名前で。ファイルはカートリッジが置いてあるフォルダ(ディレクトリー)と同じ場所に書き出されます。folderコマンドでそのフォルダのウィンドウが開きます。さらに、
export("blah%d.wav")
というように名前に”%d”をつけると、すべての効果音が書き出されます。(音を作っていなくても64ファイル作られます。)
PICO-8シーン最新情報
Tiny-TV Jamという、かなり個性的でおもしろいオンラインゲームジャムが開催されていたので、紹介します。これは、Trasevol Dogさんが作った、PICO-8上で動くボクセルでできたTVの中で動くゲームを作る、というもの。このTVの解像度はたったの10×11です。さらに、そのボクセルTV自体のデザインも、ジャムに含まれます。ちょっと理解しづらいかもしれませんが……以下のGIFアニメを見ればわかるはず。
?!! 59 Tiny TVs + Games !!?
?!! Entered Tiny-TV Jam !!?
?! https://t.co/I91o8c9rCS
?! Play'em they're amazing !?#tinyTVjam #pico8 #gamedev pic.twitter.com/nCyidepuIN— Rémy? (@TRASEVOL_DOG) January 24, 2017
参加作品はこちらで遊べます。ジャムは終わりましたが、興味のある方はぜひこちらからTiny-TVカートリッジをダウンロードして、カスタマイズしてみましょう。スプライトシートを編集するだけでボクセルのTVをデザインできるので、なかなか面白いですよ。