Comments
Description
Transcript
SUZUKI PLAN - Video Game System
SUZUKI PLAN - Video Game System - Version 1.01 Software Development Kit - Manual Copyright 2012, SUZUKI PLAN. All Rights Reserved. (変更歴) No. Date Update 1 8-Oct, 2012 初版 2 8-Oct, 2012 「1-4 入手」を追加。(ただし、まだ公開申請中なので暫定) 3 9-Oct, 2012 「4-3 留意点」に time_t 型に関する留意点を追加。 4 10-Oct, 2012 Version 1.01 に対応した内容に変更しました。 変更内容は、「1-5 変更内容」を参照してください。 5 11-Oct, 2012 ・Vector へ公開開始に伴い、「1-4 入手」の内容を改訂。 ・「8. 作者情報」を追加。 6 14-Oct, 2012 DSLOT 対応関連の誤植訂正。 ※誤字・脱字などの誤植訂正については、版をアップ(No.を追加)せずに随時改定します。 ※ただし、VGS 本体同梱マニュアルとの違いを示すのに必要だと判断した場合、誤植訂正でも版をアップする事があります。 ※最新版のマニュアル(HTML 形式)は、http://hp.vector.co.jp/authors/VA040196/vgs/からご確認いただけます。 - 1 / 49 - 目次 1. 概要..................................................................................................................................................4 1-1 VGS とは....................................................................................................................................4 1-2 使用許諾...................................................................................................................................5 1-3 基本スペック..............................................................................................................................6 1-4 入手...........................................................................................................................................8 1-5 変更内容...................................................................................................................................8 2. 事前準備..........................................................................................................................................9 2-1 インストール...............................................................................................................................9 2-2 ハードウェア..............................................................................................................................9 2-3 必須ソフトウェア........................................................................................................................9 2-4 デバイスの設定.......................................................................................................................11 2-5 推奨ソフトウェア......................................................................................................................12 3. プロジェクト作成.............................................................................................................................13 3-1 プロジェクトとは.......................................................................................................................13 3-2 vgsmkpj コマンドの実行..........................................................................................................13 3-3 実行例.....................................................................................................................................13 3-4 ビルドの流れ...........................................................................................................................14 4. プログラムの作り方.........................................................................................................................20 4-1 game.c......................................................................................................................................20 4-2 インターフェース......................................................................................................................24 4-3 留意点.....................................................................................................................................24 5. ROM データの作り方.....................................................................................................................26 5-1 データ構造..............................................................................................................................26 5-2 CHR 形式データの作成.........................................................................................................26 5-3 PCM 形式データの作成.........................................................................................................27 5-4 BGM 形式データの作成........................................................................................................28 5-5 DAT 形式データの作成..........................................................................................................29 5-6 ROMDATA.BIN の作成.........................................................................................................29 6. API リファレンス..............................................................................................................................31 6-1 関数一覧.................................................................................................................................31 6-2 入力.........................................................................................................................................32 (1) vge_touch............................................................................................................................32 (2) vge_setPause.......................................................................................................................32 6-3 スプライト描画.........................................................................................................................33 (1) vge_putSP............................................................................................................................33 (2) vge_putSPH.........................................................................................................................33 (3) vge_putSPM........................................................................................................................33 (4) vge_putSPMH.....................................................................................................................34 6-4 BG 描画...................................................................................................................................34 (1) vge_putBG...........................................................................................................................34 (2) vge_putBG2.........................................................................................................................34 - 2 / 49 - (3) vge_clear.............................................................................................................................35 (4) vge_scroll............................................................................................................................35 6-5 図形描画.................................................................................................................................35 (1) vge_pixelBG / vge_pixelSP................................................................................................35 (2) vge_lineBG / vge_lineSP....................................................................................................35 (3) vge_circleBG / vge_circleSP...............................................................................................36 (4) vge_boxBG / vge_boxSP....................................................................................................36 (5) vge_boxfBG / vge_boxfSP..................................................................................................36 6-6 音声.........................................................................................................................................37 (1) vge_eff.................................................................................................................................37 (2) vge_effstop..........................................................................................................................37 (3) vge_effstopA.......................................................................................................................37 (4) vge_bplay............................................................................................................................37 (5) vge_bstop.............................................................................................................................38 (6) vge_bresume........................................................................................................................38 (7) vge_bfade............................................................................................................................38 (8) vge_setmute.........................................................................................................................38 (9) vge_getmute........................................................................................................................39 6-7 数学.........................................................................................................................................39 (1) vge_sin.................................................................................................................................39 (2) vge_cos................................................................................................................................39 (3) vge_rad................................................................................................................................40 (4) vge_kkd...............................................................................................................................40 (5) vge_kkd2rad........................................................................................................................40 (6) vge_rad2kkd........................................................................................................................40 (7) vge_rands.............................................................................................................................41 (8) vge_rand..............................................................................................................................41 6-8 その他......................................................................................................................................41 (1) vge_getdata..........................................................................................................................41 7. MML リファレンス...........................................................................................................................43 7-1 概要.........................................................................................................................................43 7-2 マクロ.......................................................................................................................................43 7-3 チャネル..................................................................................................................................43 7-4 オペランド................................................................................................................................43 7-5 ノート........................................................................................................................................45 7-6 例.............................................................................................................................................45 8. 作者情報........................................................................................................................................49 - 3 / 49 - 1. 概要 1-1 VGS とは SUZUKI PLAN - Video Game System(VGS)とは、C 言語を用いて Windows/Android 共通の実装でゲームを作成できる仮想プラットフォームです。 ゲーム開発者は、VGS を用いることでゲーム本質部分の開発に勢力を注ぎ込むこ とができます。似たような思想で作られた「プラットフォーム共通化ツール」の類は 他にも腐るほどありますが、VGS の最も特徴的な点は、2D ゲームの開発に特化し ていることと、仮想ハードウェアの仕様が非常にチープであることです。 ゲームハードウェアは、時代とともに「限界を無くす」方向へ進化してきました。し かし、その進化の結果、グラフィックのリアルさなどのゲーム本質とはあまり関係な い部分に対してリソースを注ぎ込む無駄が生じるようになりました。現在、1本の ゲーム製作に掛かる費用は、嘗てのハリウッド映画に匹敵する莫大なものらしいで す。その結果、とてもリアルでヌルヌル動く映画顔負けのゲームがリリースされてい る訳ですが、それらの「ゲームそのものの面白さ」に関しては、適切な費用対効果 を得られているとは言い難いです。如何に動きがリアルであっても、ゲーム性が殆 ど無く、つまらないものしか無いという印象です。ゲームを面白くするのに必要な投 資の選択と集中を誤っていることがその原因であると、私は考えています。事実、 注ぎ込んだリソースはファミコン版マリオよりも桁違いに多い筈なのに、マリオの方 が桁違いに面白かったと思うので。 ゲームの本質部分を面白くするには、ゲーム本質部分の開発にリソース(資金や 人材)を注ぎ込むべきです。ゲームハードウェアは、ある段階で進化を止め、ソフト の開発にのみリソースを集中するのが適切な選択だった筈です。しかし、全ての生 物は遺伝的に、進化を止めることに対して背徳的な観念を持っているため、進化を 止めることはできません。 進化論の観点で見れば、ゲームに対して面白さを追求する行為そのものが淘汰 されるべき存在なのかもしれません。 しかし、私は今の「リアルでつまらないゲーム」より、嘗ての「面白かったゲーム」 の方が好きです。もちろん、「ゲームが面白いか否か」の判断には多くの定性的な 要素が関係するので、私の「嘗てのゲームの方が面白かった」という感覚は、ノスタ ルジーが創り出した幻想なのかもしれません。幾らでも反証の余地はあると思いま す。しかしながら、この議論について定まった解は得られていません。恐らくそれは 「神のみぞ知る」領域の問題かもしれません。なので、これについて哲学しても禅問 答にしかならないので、時間の無駄だと思います。最も賢い選択は、自分が正しい と思うことを信じることです。 - 4 / 49 - 仮に私の考えが正しければ、このままでは面白いゲームは絶滅することになりま す。そこで、私は面白いゲームが絶滅することを阻止するため、ゲーム開発者が ゲーム本質部分の面白さを追求したモノ作りができるプラットフォームとして、この 必要最低限のハードウェア機能のみを実装したシンプルな仮想ゲーム機「VGS」を 開発しました。 VGS で作られたゲームの具体例として、SUZUKI PLAN が開発した「NOKOGI Rider」を遊んでみてください。 ・Windows 版 NOKOGI Rider(http://www.melonbooks.com/index.php?main_page=product_info&products_id=IT0000157766) ・Android 版 NOKOGI Rdier(https://play.google.com/store/apps/details?id=com.suzukiplan.SHOT04T) ※製品版を買って頂けると嬉しいですが、無料の体験版(Lite 版)でも、VGS の雰囲気を十分に掴める筈 NOKOGI Rider(あと、Invader Block 2)は、VGS を用いて作られています。 NOKOGI Rider の場合、プログラム作成開始から完成まで半年弱の期間で作りまし た。 もちろん、開発に携わったプログラマは私ひとりだけです。 ついでに、NOKOGI Rider の開発が専業ではなく、普通の会社勤めのサラリーマン家業をこなしながら です。 普通の人間がこれだけのものを僅か半年弱でひとりで作るのは不可能です。 恐らく、専業で開発したとしても相当無理がある筈です。 別に私の能力が特別高 い訳でもないと思います。 VGS を採用したからこそ、それを実現できました。 1-2 使用許諾 VGS を利用される前に、以下についてご了承ください。 • VGS の著作権は SUZUKI PLAN が有します。 • VGS は、再配布可能とします。 • VGS で作られたゲームを再配布する場合、必ずそのゲームに付随するユーザ公開ドキュ メントに「本プログラムは、SUZUKI PLAN-Video Game System を用いて作られていま す。」と明記してください。 • VGS を用いて開発されたプログラム及びデータは、その作成者が著作権を有し、 その作 成者の責任で自由に配布又は販売できます。 それに際し、VGS に付属するモジュールの 一部(ランタイム)を構成物の一部として同梱できるものとします。 • VGS の不具合が見つかり、SUZUKI PLAN に修正を依頼する場合、不具合の現象が発 生する必要最小限のソースコードで実装したプログラム(再現プログラム)を提示しなけれ ばならないものとします。 再現プログラムの提示が無い不具合の報告は「VGS 側の問題で はないもの」と見做します。 また、仮に再現プログラムの提示があっても、SUZUKI PLAN は確実にその修正に応じなくても良く、修正の実施に関する判断は SUZUKI PLAN の決 定に従わなければならないものとします。 • SUZUKI PLAN は、VGS 又は VGS を用いて開発されたプログラムの使用により生じた損 失全般(VGS の不具合に起因する場合を含む)につき、一切の保障義務を負わないもの とします。 - 5 / 49 - (補足) 明確な許諾条項とすることは避けますが、VGS を用いてゲームを作成する場合、 極力商売をするようにしてください。 体験版などをフリーで配るのは良いですが、フ リーで配るのはあくまでも体験版などの試供品に留め、開発者が利益を得る手段 を確保することを推奨します。 なお、アフィリエイトはあまりオススメしません。なる べく有償で販売し、その対価で利益を得るように努めてください。 ただ、商売をする となると色々と大変なところもあるので、使用許諾としての明文化は避けました。 ち なみに商売をする場合、特に気をつけないといけないのは、知的財産権(主に著作 権)と税関系(源泉徴収や消費間接税)の事です。 知的財産権については、絵、音、 プログラム(VGS 部分を除く)の全てを自作すれば気にする必要がないので、それを 推奨します。 1-3 基本スペック VGS は「仮想ゲーム機」です。つまり、概念はハードウェアですが、実体はハード ウェアではありません。 要するにエミュレータです。しかし、模倣対象が物理的に存 在しない点が普通のエミュレータと異なります。 この方式を採ることで、VGS という ゲーム機が死ななくなるメリットがあります。 例えば、現行のハードウェアが廃れて も、VGS を新しいハードウェアで動けるように移植することで、 ゾンビのように生き 残り続けることができます。 (ハードウェアスペック) 項目 仕様 画面サイズ 240x320(縦画面の QVGA)固定 同時発色数 最大 256 色 ビデオメモリ スプライト(1 面) + BG(1 面) スプライト ・GSLOT(後述)から任意サイズの矩形データを転送できる ・パレット番号 0 番を透明色とする ・特定パレットでの単色表示(マスク表示)が可能 ・1/2 サイズでの縮小表示が可能 ・縮小+マスク表示が可能 ・拡大機能なし ・回転機能なし ・半透明表示機能なし BG ・GSLOT(後述)から任意サイズの矩形データを転送できる ・8方向スクロールが可能 入力装置 シングルタッチのタッチパネル + ポーズボタン 入力装置 (Windows) ・左クリックをタッチとする ・右クリック又は ESC キーをポーズとする - 6 / 49 - 入力装置 (Android) ・シングルタッチをタッチとする ・3 点マルチタッチ又は戻るボタンをポーズとする ・ホームボタンが押された場合、ポーズしてからホーム画面に戻る 音声 22050Hz / 16bit / モノラル EFF 音源 PCM 音源 BGM 音源 波形メモリ音源(後述) SLOT 領域 以下の 4 種類×各 256 個の SLOT 領域で構成される ・最大 256x256 のグラフィックを最大 256 個(GSLOT) ・PCM 効果音を最大 256 個(ESLOT) ・BGM を最大 256 個(BSLOT) ・任意バイナリデータを最大 256 個(DSLOT) ※1 つのゲームで使用できる ROM ファイルは 1 つのみ(複数 ROM 不可) 3D グラフィック 対応しない(※対応していないではなく) ネットワーク通信 対応しない(※対応していないではなく) エミュレーションしない ※動作環境の Native コードで動作 CPU (波形メモリ音源 + 音源ドライバ) 項目 仕様 基本仕様 22050Hz / 16bit / モノラル 分解精度 22050fps チャネル数 (同時発音数) 6チャネル 音色数 以下の 4 種類。 ・三角波 ・ノコギリ波 ・矩形波 ・ノイズ 音色の設定 チャネル毎に自由に設定や切り替えが可能 エンベロープ チャネル毎に開始・停止について設定可能 ボリューム マスターボリュームとチャネル毎のベロシティーを設定可能 ピッチベンド 自動キーダウンが可能(自動キーアップは不可能) その他 ・ポーズ可能 ・フェードアウト可能 1-4 入手 VGS は、Vector から入手できます。 - 7 / 49 - http://www.vector.co.jp/soft/winnt/prog/se499640.html 1-5 変更内容 Version 変更内容 ROM データの SLOT 領域に DSLOT を追加しました。 1.01 - 1-3 基本スペック - 5-1 データ構造 - 5-5 DAT 形式データの作成 - 6-8 その他 - vge_getdata - 8 / 49 - 2. 事前準備 2-1 インストール VGS を任意ディレクトリに配置してください。 なお、配置先は「C:\VGS」という前提で説明します。他の配置先に配置した場合、 適宜読み替えをおこなってください。 その後、次のシステム環境変数を設定してください。 - VGS_HOME: C:\VGS - PATH: 末尾に「;%VGS_HOME%\bin」を追記 2-2 ハードウェア Android を搭載した端末を準備する必要があります。 Android SDK 付属のエミュ レータは使い物にならないので使用しません。 ハードウェアが準備できない場合、 一時的にエミュレータで代替しても良いかもしれませんが、全く動作しないかもしれ ません。 なお、調達したハードウェアの種類によって、色々と準備の方法が変わっ てきます。 ここでは、想定デバッグ機として Sony のウォークマン Z シリーズ(NWZ1000)を用いるものとします。 Android 版 VGS の最低動作 OS は Android2.3.3 以降になります。 NW-Z1000 は Android4.0 へのアップデートが予定されていますが、 デバッグ機として調達した NW-Z1000 は Android2.3 で使い続けることを推奨します。 私の経験上、Android2.3 の端末を 4.0 にアップデートすると、色々と良からぬ事が起こります(しかし、バー ジョンダウンはできない)。 NW-Z1000 以外の端末を調達される場合も、極力 Android2.3 を搭載したものにすることを推奨します。 また、コンパイル機には Windows 7 を搭載した PC を用いることを前提に説明しま す。 Windows 7 以外の OS を使用される場合、使用される OS での手順への読み 替えを行ってください。 2-3 必須ソフトウェア 以下のソフトウェアを入手する必要があります(全て無料で入手できます)。 リンク 先がデッドリンク等になっている場合、Google 検索するなどして探してください。 な お、VGS の場合、全てのツールは CLI(コマンドラインインタフェース)のみ使用しま す。 一般的に Android のプログラム開発では Eclipse などを使うようですが、VGS で開発する場合は不要です。 Visual C++の統合環境(IDE)についても同様です。 - 9 / 49 - CLI の方が生産効率が確実に良いので、IDE には手を出さないことを強く推奨しま す。 1.Java SE 6 / JDK Java は基本的に使いませんが、Android 用にコンパイルする時に必要になり ます。 なお、インストール先は「C:\android\jdk」という前提で説明します。 他のインストール先にインストールした場合、適宜読み替えをおこなってくだ さい。 インストール後に次のシステム環境変数を設定してください。 - JAVA_HOME: C:\android\jdk - PATH: 末尾に「;%JAVA_HOME%\bin」を追記 2.Visual C++ Express Edition Windows 用のコンパイラです。 バージョンは幾つでも問題無いと思いますが、2010 を使用する想定で説明し ます。 なお、Windows 用の VGE は DirectX9 を用いていますが、DirectX SDK は入 手不要です(有っても問題ありません)。 ただし、動作させるのにランタイム (DirectX End-User Runtime)は必要なので、ランタイムを入れてない場合は 入れてください。 3.Android SDK Android 用の SDK です。 なお、インストール先は「C:\android\sdk」という前提で説明します。 他のインストール先にインストールした場合、適宜読み替えをおこなってくだ さい。 インストールできたら SDK Manager を起動し、以下のパッケージをインストー ルしてください。 - Android SDK Tools - Android SDK Platform-tools - Android 2.3.3 (API level 10) の SDK-Platform - Google USB driver インストール後に次のシステム環境変数を設定してください。 - PATH: 末尾に「;C:\android\sdk\platform-tools」を追記 - PATH: 末尾に「;C:\android\sdk\tools」を追記 4.Apache Ant Android SDK でビルド作業を行うために必要なツールです。 - 10 / 49 - なお、インストール先は「C:\android\ant」という前提で説明します。 他のインストール先にインストールした場合、適宜読み替えをおこなってくだ さい。 インストール後に次のシステム環境変数を設定してください。 - PATH: 末尾に「;C:\android\ant\bin」を追記 5.Cygwin NDK を使用するために必要です。 インストール時に以下のパッケージを追加インストールしてください。 - [Devel] make: The GNU version of the 'make' utility - [Devel] gcc4: GCC Release series 4 compiler 6.Android NDK Android でネイティブコードを用いた開発をするのに必要なツールです。 なお、インストール先は「C:\android\ndk」という前提で説明します。 他のインストール先にインストールした場合、適宜読み替えをおこなってくだ さい。 インストール後に次のシステム環境変数を設定してください。 - HOST_AWK: /usr/bin/gawk - NDK_ROOT: C:\android\ndk - PATH: 末尾に「;%NDK_ROOT%」を追記 2-4 デバイスの設定 NW-Z1000 をデバッグ機として使用できるようにするための設定を行います。 NW-Z1000 以外の端末を使用する場合、それぞれの端末のマニュアルや保守情報 を確認し、 それぞれの端末を使用するための準備を行ってください。 1.C:\android\sdk\extras\google\usb_driver\android_winusb.inf をメモ帳で開 く 2.[Google.NTx86]と[Google.NTamd64]に以下の行を追加 %CompositeAdbInterface% = USB_Install, USB\VID_054C&PID_0691&MI_01 3.以下のコマンドを実行 echo 054c > "%SystemDrive%%HomePath%\.android\adb_usb.ini" 4.NW-Z1000 をパソコンに接続 5.デバイスマネージャを開き、警告マークが付いている NW-Z1000 のアイコン 部分を右クリックして、デバイスドライバを選択(探索パスには、 C:\android\sdk\extras\google\usb_driver を指定) - 11 / 49 - 正常にセットアップできたか確認したい場合、次のコマンドを実行してみてください。 その結果、ズラズラとログが表示される場合、正常にセットアップできています。 adb logcat 2-5 推奨ソフトウェア 必ずしも必要なものではありませんが、VGS 対応のゲームを開発する上で役立 つツールを紹介します。 1.ALFAR 256 色のドット絵を作成するツールです。 一通り必要な機能が揃っています。 これを用いて 256x256 サイズの 256 色ビットマップを作成できます。 2.効果音エディタ_D サウンド・エフェクトを作成するツールです。 これを用いて 22050Hz/モノラル/16bit の wave ファイルを作成できます。 3.Pxtone Collage 作曲ツールです。 この作曲ツールを用いて作成したデータ(.ptcol, .pttune)をそのまま VGS の 波形メモリ音源として使用することはできませんが、 VGS の波形メモリ音源 で再生するイメージに近い音楽を作曲することができます。 なお、VGS の波形メモリ音源用の音楽は、MML を用いて作成します。 SUZUKI PLAN では、Pxtone Collage を用いて音楽を作曲し、その結果を見 ながら MML を作成しています。 せめて、ptcol をテキスト形式に変換すること ができれば、この作業を大幅に短縮できますが、ptcol のデータ形式は非公 開なので、 あきらめてください。 4.秀丸エディタ ソースコードを書くのに必要なテキストエディタです。 若干高い(4,000 円)です。 一応、お金を払わなくてもフル機能が使えて、試用期間の制限などもありま せん。 使ってみれば、値段以上の価値があることが分かると思います。 - 12 / 49 - 3. プロジェクト作成 3-1 プロジェクトとは VGS では、アプリをプロジェクトという単位で管理します。 ゲーム開発者は、VGS 対応ゲームのアプリを作成する前にプロジェクトを作成する必要があります。 3-2 vgsmkpj コマンドの実行 プロジェクトの作成には、vgsmkpj コマンドを実行します。 usage: vgsmkpj Company-name Project-name Directory Company-name : プロジェクトを管轄するカンパニー(サークル)名を指定します。 - 31 バイト以下の ASCII コードの英数字 - 先頭の文字は必ず英字にしてください (例: MyCompany) Project-name : プロジェクト名を指定します。 - 8 バイト以下の ASCII コードの英数字 - 先頭の文字は必ず大文字の英字にしてください (例: MyPrj01) Directory : プロジェクト情報を作成するディレクトリを指定します。 - 絶対パスで指定してください。 - 4~63 バイトの範囲の ASCII コードで指定してください。 - 1 バイト目はドライブレターを示す英字を指定してください。 - 2 バイト目はコロン(:)を指定してください。 - 3 バイト目はディレクトリ区切り文字(\)を指定してください。 - 4 バイト目以降は英数字、ハイフン(-)、アンダースコア(_)、ディレクトリ区切り文字 (\)を指定してください。 - 連続するディレクトリ区切り文字(\)は指定できません。 - 指定するディレクトリが存在しない場合、自動的に作成されます。 ※存在するプロジェクトのパスを指定すると一部の情報がクリアされるので注意 補足: Android 用の Java パッケージ名は、「com.Company.Project」という名称で自 動生成されます。 3-3 実行例 C:\>vgsmkpj.exe suzukiplan Test01 c:\test\Test01 creating ... c:\test\Test01\android\src\com\suzukiplan\Test01\Test01.java creating ... c:\test\Test01\android\res\values\strings.xml creating ... c:\test\Test01\android\res\layout\main.xml creating ... c:\test\Test01\android\jni\Android.mk creating ... c:\test\Test01\android\jni\external\lib\libvgeapi.a - 13 / 49 - creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating creating ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... c:\test\Test01\android\jni\external\include\vgeapi.h c:\test\Test01\android\jni\external\include\vgeint.h c:\test\Test01\android\jni\vge.h c:\test\Test01\android\jni\vge.c c:\test\Test01\android\jni\game.c c:\test\Test01\windows\src\game.c c:\test\Test01\windows\src\game.def c:\test\Test01\android\AndroidManifest.xml c:\test\Test01\android\ant.properties c:\test\Test01\android\build.xml c:\test\Test01\android\local.properties c:\test\Test01\android\main.xml c:\test\Test01\android\proguard-project.txt c:\test\Test01\android\proguard.cfg c:\test\Test01\android\project.properties c:\test\Test01\romdata\gslot000.bmp c:\test\Test01\romdata\eslot000.wav c:\test\Test01\romdata\bslot000.mml c:\test\Test01\romdata\GSLOT000.CHR c:\test\Test01\romdata\ESLOT000.PCM c:\test\Test01\romdata\BSLOT000.BGM c:\test\Test01\android\res\drawable\icon.png c:\test\Test01\android\res\drawable-ldpi\icon.png c:\test\Test01\android\res\drawable-mdpi\icon.png c:\test\Test01\android\res\drawable-hdpi\icon.png c:\test\Test01\windows\lib\VGEAPI.LIB c:\test\Test01\windows\VGEAPI.DLL c:\test\Test01\windows\include\vgeapi.h c:\test\Test01\windows\Test01.exe c:\test\Test01\windows\makefile C:\> vgsmkpj コマンドが成功すると、引数で指定したディレクトリ配下に次のディレクトリ が作成されます。 •romdata : ROM データを格納するディレクトリ •windows : Windows 用のビルド環境が格納されるディレクトリ •android : Android 用のビルド環境が格納されるディレクトリ これらのディレクトリにはサンプルプログラム(Hello,World!)が自動生成されていま す。 3-4 ビルドの流れ プロジェクト作成時に自動生成されるサンプルプログラムを実際にビルドする方法 を説明します。 全体の作業の流れを把握してください。 1.ROM データのビルド 最初に、ROM データをビルドします。ROM データとは、画像、効果音、BGM のデータ集合です。 - 14 / 49 - スタートメニューから Visual Studio コマンドプロンプトを起動し、windows ディ レクトリへ移動し、「nmake rom」と実行してください。 Setting environment for using Microsoft Visual Studio 2010 x86 tools. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>cd c:\test\Test01 c:\test\Test01>cd windows c:\test\Test01\windows>nmake rom Microsoft(R) Program Maintenance Utility Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. C:\program2\VGS\bin\vgsrom ..\romdata ROMDATA.BIN write GSLOT000.CHR ... 66564 byte ... wrote write ESLOT000.PCM ... 13896 byte ... wrote write BSLOT000.BGM ... 59248 byte ... wrote copy ROMDATA.BIN ..\android\res\raw\romdata.bin 1 個のファイルをコピーしました。 c:\test\Test01\windows> これで、ROM データが作成されました。 2.Windows 版のビルド 次に、Windows 版のプログラムをビルドします。 Windows 版のプログラムをビルドするには、windows ディレクトリで「nmake game」と実行してください。 c:\test\Test01\windows>nmake game Microsoft(R) Program Maintenance Utility Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. mkdir .\Release CL /nologo /Zi /Ot /GS- /GR- /GF /Fd".\Release\vc.pdb" /Fo".\Release\\" /W3 /WX /LD /D_CRT_SECURE_NO_WARNINGS /Iinclude /c .\src\game.c game.c LINK /NOLOGO /DEBUG /DLL /OUT:.\Release\GAME.DLL /MAP:.\Release\GAME.MAP /PDB:.\Release\GAME.PDB /DEF:.\src\game.def /MACHINE:X86 /SUBSYSTEM:WINDOWS .\ Release\game.obj lib\vgeapi.lib ライブラリ .\Release\GAME.lib とオブジェクト .\Release\GAME.exp を作成中 copy .\Release\GAME.DLL GAME.DLL 1 個のファイルをコピーしました。 c:\test\Test01\windows> これで、Windows 版のプログラムが作成されました。 これで、Windows 版のサンプルプログラムを実行することができます。 サンプルプログラムを実行するには、windows ディレクトリで「プロジェクト 名.exe」を実行してみてください。 サンプルプログラムを実行すると、画面中央に「Hello,World!」と表示され、カッ コイイ BGM が鳴っていると思います。 - 15 / 49 - マウスで左クリックすると「Hello,World!」が動きます。 右クリックするとポーズ画面になり、「Resume」を選択するとメイン画面に戻り、 「Exit」を選択すると終了します。 なお、Windows 版を再配布するときに必要なファイルは、windows ディレクトリ 直下にある以下4つです。 - GAME.DLL : ゲーム本体のプログラムコードの入った DLL です。 - VGEAPI.DLL : VGS のランタイムです。 - ROMDATA.BIN : ROM データです。(最初の ROM データ作成手順で配置さ れたファイルです) - プロジェクト名.exe : 実行モジュールです。 3.Android 版(JNI)のビルド 次に、Android 版のビルドです。Android 版の場合、JNI と APK をビルドする 必要があります。 JNI とは、ゲームの本体プログラムが記述されたモジュールのことです。 JNI をビルドするには、Cygwin を起動し、android ディレクトリ下の jni ディレク トリへ移動後、「ndk-build」と実行してください。 SuzukiPlan@spdev03 / # cd /cygdrive/c/test/Test01/android/jni/ SuzukiPlan@spdev03 /cygdrive/c/test/Test01/android/jni # ndk-build Cygwin : Generating dependency file converter script Compile thumb : vge <= vge.c Compile thumb : vge <= game.c Prebuilt : libvgeapi.a <= jni/external/lib/ SharedLibrary : libvge.so Install : libvge.so => libs/armeabi/libvge.so SuzukiPlan@spdev03 /cygdrive/c/test/Test01/android/jni # 4.Android 版(APK)のビルド 最後に APK のビルドをします。APK とは、Android のアプリケーション・パッ ケージのことです。 APK のビルド方法には、Release ビルドと Debug ビルドがあります。 マーケッ トなどで配布する時は、Release ビルド、署名、ZIP アラインメントの調整と いった作業が必要(=説明するのが面倒)なので、 ここではデバッグビルド→ 実行の方法までを解説します。 Release ビルドの方法については、各々で調 べてください。 Debug ビルドをするには、android ディレクトリ下で「ant debug」と実行します。 c:\test\Test01\android>ant debug - 16 / 49 - Buildfile: c:\test\Test01\android\build.xml -set-mode-check: -set-debug-files: -check-env: [checkenv] Android SDK Tools Revision 20.0.1 [checkenv] Installed at C:\android\sdk -setup: [echo] Project Name: Test01 [gettype] Project Type: Application -set-debug-mode: -debug-obfuscation-check: -build-setup: [echo] Resolving Build Target for Test01... [gettarget] Project Target: Android 2.3.3 [gettarget] API level: 10 [echo] ---------[echo] Creating output directories if needed... [mkdir] Created dir: c:\test\Test01\android\bin [mkdir] Created dir: c:\test\Test01\android\bin\res [mkdir] Created dir: c:\test\Test01\android\gen [mkdir] Created dir: c:\test\Test01\android\bin\classes [echo] ---------[echo] Resolving Dependencies for Test01... [dependency] Library dependencies: [dependency] No Libraries [dependency] [dependency] -----------------[dependency] API<=15: Adding annotations.jar to the classpath. [echo] ---------[echo] Building Libraries with 'debug'... [subant] No sub-builds to iterate on -pre-build: -code-gen: [mergemanifest] Merging AndroidManifest files into one. [mergemanifest] Manifest merger disabled. Using project manifest only. [echo] Handling aidl files... [aidl] No AIDL files to compile. [echo] ---------[echo] Handling RenderScript files... [renderscript] No RenderScript files to compile. [echo] ---------[echo] Handling Resources... [aapt] Generating resource IDs... [echo] ---------[echo] Handling BuildConfig class... [buildconfig] Generating BuildConfig class. -pre-compile: -compile: [javac] Compiling 3 source files to c:\test\Test01\android\bin\classes -post-compile: -obfuscate: -dex: [dex] Converting compiled files and external libraries into c:\test\Test01 \android\bin\classes.dex... - 17 / 49 - -crunch: [crunch] Crunching PNG Files in source dir: c:\test\Test01\android\res [crunch] To destination dir: c:\test\Test01\android\bin\res [crunch] Processing image to cache: c:\test\Test01\android\res\drawable-hdpi\ icon.png => c:\test\Test01\android\bin\res\drawable-hdpi\icon.png [crunch] (processed image to cache entry c:\test\Test01\android\bin\res\dra wable-hdpi\icon.png: 0% size of source) [crunch] Processing image to cache: c:\test\Test01\android\res\drawable-ldpi\ icon.png => c:\test\Test01\android\bin\res\drawable-ldpi\icon.png [crunch] (processed image to cache entry c:\test\Test01\android\bin\res\dra wable-ldpi\icon.png: 0% size of source) [crunch] Processing image to cache: c:\test\Test01\android\res\drawable-mdpi\ icon.png => c:\test\Test01\android\bin\res\drawable-mdpi\icon.png [crunch] (processed image to cache entry c:\test\Test01\android\bin\res\dra wable-mdpi\icon.png: 0% size of source) [crunch] Processing image to cache: c:\test\Test01\android\res\drawable\icon. png => c:\test\Test01\android\bin\res\drawable\icon.png [crunch] (processed image to cache entry c:\test\Test01\and [crunch] roid\bin\res\drawable\icon.png: 0% size of source) [crunch] Crunched 4 PNG files to update cache -package-resources: [aapt] Creating full resource package... -package: [apkbuilder] Current build type is different than previous build: forced apkbuil der run. [apkbuilder] Creating Test01-debug-unaligned.apk and signing it with a debug key ... -post-package: -do-debug: [zipalign] Running zip align on final apk... [echo] Debug Package: c:\test\Test01\android\bin\Test01-debug.apk [propertyfile] Creating new property file: c:\test\Test01\android\bin\build.prop [propertyfile] Updating property file: c:\test\Test01\android\bin\build.prop [propertyfile] Updating property file: c:\test\Test01\android\bin\build.prop [propertyfile] Updating property file: c:\test\Test01\android\bin\build.prop -post-build: debug: BUILD SUCCESSFUL Total time: 5 seconds c:\test\Test01\android> あとは、実機インストールすれば Android でも Windows 版と同じ 「Hello,World!」が動きます。 実機インストールは、初回インストール時は「adb install bin\プロジェクト名debug.apk」、2回目以降は「adb install -r bin\プロジェクト名-debug.apk」と実 行すればできます。 c:\test\Test01\android>adb install -r bin\Test01-debug.apk 1128 KB/s (105181 bytes in 0.091s) pkg: /data/local/tmp/Test01-debug.apk Success - 18 / 49 - c:\test\Test01\android> タッチ&スライドで Hello,World!を動かすことができます。 ポーズをするには、画面を3点マルチタッチするか、戻るボタンを押してくださ い。 なお、ホームボタンを押した場合、ポーズ状態にしてからホーム画面に戻りま す。 (補足:アイコンについて) アプリケーションに設定されているアイコンは、外部へリリース時に差し替えてくださ い。 Android 版は android/res 以下にある icon.png というファイルを差し替えてください (36x36, 48x48, 72x72 の 3 種類を差し替える必要があります)。 Windows 版はリ ソースエディタを使って exe ファイルのアイコンリソース(リソース ID=1000)を差し替 えてください。 - 19 / 49 - 4. プログラムの作り方 4-1 game.c プログラムは基本的に「game.c」というソースファイルに記述してください。 game.c 以外のソースファイルを追加したい場合、makefile や Android.mk を編集して追加し てください。 makefile の書き方に関する説明は省きますが、SUZUKI PLAN が作成 した makefile は手書き編集を前提としたかなり見易いものなので、 中身を見れば makefile の仕組みを理解しながら容易に目的とする変更ができると思います。 game.c は次のディレクトリに格納されています。 •Windows 版: プロジェクトディレクトリ\windows\src\game.c •Android 版: プロジェクトディレクトリ\android\jni\game.c (初期状態の game.c の内容) /* 利用推奨ヘッダファイル(下記以外のヘッダを使用した場合の動作は未確認) */ #include <stdio.h> #include <stdarg.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <ctype.h> #include "vgeapi.h" /* 矩形同士の衝突をチェックするマクロ */ #define HITCHK(X1,Y1,XS1,YS1,X2,Y2,XS2,YS2) (X1<X2+XS2 && X2<X1+XS1 && \ Y1<Y2+YS2 && Y2<Y1+YS1) /* 入力情報を保存しておく構造体 */ struct InputInf { int s; /* タッチ状態(vge_touch で取得) */ int cx; /* X タッチ位置(vge_touch で取得) */ int cy; /* Y タッチ位置(vge_touch で取得) */ int dx; /* X スライド量(vge_touch で取得) */ int dy; /* Y スライド量(vge_touch で取得) */ }; /* スプライトを使った文字列表示処理(例)*/ static void myprint(int x,int y,const char* msg,...); /* *---------------------------------------------------------------------------* [VGE-API] 初期化処理 * 戻り値: 0 以外でリターンすると起動に失敗する *---------------------------------------------------------------------------*/ int vge_init() { - 20 / 49 - int i,j; /* 背景の壁を BG 領域へ描画 */ for(i=0;i<30;i++) { for(j=0;j<40;j++) { vge_putBG(0,0,24,8,8,i*8,j*8); } } /* BGM を再生 */ vge_bplay(0); return 0; } /* *---------------------------------------------------------------------------* [VGE-API] 終了処理 *---------------------------------------------------------------------------*/ int vge_term() { return 0; } /* *---------------------------------------------------------------------------* [VGE-API] ループ処理 (フレーム毎に呼び出される処理) * 戻り値: 0 以外でリターンすると終了する *---------------------------------------------------------------------------*/ int vge_loop() { static int prevS=0; static int x=68; static int y=156; struct InputInf ci; /* タッチ状態を取得 */ vge_touch(&ci.s,&ci.cx,&ci.cy,&ci.dx,&ci.dy); /* タッチ状態が変化したら効果音を鳴らす */ if(prevS) { if(0==ci.s) { /* 離された */ prevS=0; vge_eff(0); } } else { if(0!=ci.s) { /* 押された */ prevS=1; vge_eff(0); - 21 / 49 - } } /* 移動 */ x+=ci.dx; y+=ci.dy; /* 描画 */ myprint(4,4,"[vge_loop]"); myprint(4,14,"Position:X=%d,Y=%d",x,y); myprint(x,y,"Hello, World!"); } return 0; /* *---------------------------------------------------------------------------* [VGE-API] ポーズ処理 (ポーズ中にフレーム毎に呼び出される処理) * 戻り値: 0 以外でリターンすると終了する *---------------------------------------------------------------------------*/ int vge_pause() { static struct InputInf pi; struct InputInf ci; int push_flag=0; int select_menu=0; /*======================================================================== 入力処理 ========================================================================*/ /* タッチ状態を取得 */ vge_touch(&ci.s,&ci.cx,&ci.cy,&ci.dx,&ci.dy); /* 直前のタッチ状態の s が 1->0 になった場合、push_flag を立てる */ if(0==ci.s && 0!=pi.s) { push_flag=1; ci.cx=pi.cx; ci.cy=pi.cy; } /* 現在のタッチ状態を直前のタッチ状態として保持 */ /* (push_flag の判定用) */ memcpy(&pi,&ci,sizeof(pi)); /*======================================================================== 描画処理 ========================================================================*/ myprint(4,4,"[vge_pause]"); - 22 / 49 - /* ボタンの枠線を描画 */ vge_boxSP(80,120,160,150,111); vge_boxSP(80,170,160,200,111); /* ボタンを押している場合、塗りつぶす */ /* (push_flag が立っている場合、select_menu を設定する) */ if(ci.s || push_flag) { if(HITCHK(ci.cx-4,ci.cy-4,8,8, 80,120,80,30)) { if(push_flag) select_menu=1; vge_boxfSP(81,121,159,149,72); } else if(HITCHK(ci.cx-4,ci.cy-4,8,8, 80,170,80,30)) { if(push_flag) select_menu=2; vge_boxfSP(81,171,159,199,72); } } /* ボタンの文字列を描画 */ myprint(96,132,"Resume"); myprint(104,182,"Exit"); /* 押されたボタンに対応する処理を実行 */ switch(select_menu) { case 1: vge_setPause(0); break; case 2: return 1; } } return 0; /* *---------------------------------------------------------------------------* スプライトを使った文字列表示処理(例) *---------------------------------------------------------------------------*/ static void myprint(int x,int y,const char* msg,...) { char buf[256]; int i; int c; int d; va_list args; va_start(args,msg); vsprintf(buf,msg,args); - 23 / 49 - va_end(args); } for(i=0;'\0'!=(c=(int)buf[i]);i++,x+=8) { c-=0x20; c&=0x7f; d=c>>5; vge_putSP(0,(c-(d<<5))<<3,d<<3,8,8,x,y); } 4-2 インターフェース game.c には、VGS の本体処理(VGE)から呼び出される以下 4 種類のインター フェース処理を「必ず」実装しなければなりません。 1.vge_init プログラム起動後、最初に呼び出される処理です。 初期化処理を記述してください。 0 をリターンすれば初期化成功、0 以外をリターンすれば初期化失敗となりま す。 2.vge_term プログラム終了直前に呼び出される処理です。 データ保存や必要であれば各種開放処理を記述してください。 リターン値は意味がありません。(とりあえず 0 でリターンしてください) 3.vge_loop 画面の更新間隔(Windows は 60fps/Android はだいたい 60fps)毎に呼び出 される処理です。 ゲームの主処理を記述してください。 0 をリターンすれば処理継続、0 以外をリターンすればプログラムを終了しま す。 4.vge_pause ポーズした時に、画面の更新間隔(Windows は 60fps/Android はだいたい 60fps)毎に呼び出される処理です。 ゲームのポーズ処理を記述してください。 0 をリターンすれば処理継続、0 以外をリターンすればプログラムを終了しま す。 4-3 留意点 VGS 用のプログラムを記述する場合、次の点を留意してください。 - 24 / 49 - 1.OS 依存処理は書かない game.c 内では、極力 OS 依存処理(Windows/Android で動作が異なる処理) を記述しないようにしてください。どうしても必要な場合は、条件プリプロセッ サを記述するなどしてください。 2.ANSI/C 推奨 ANSI で規定されている範囲の C 言語で記述することを推奨します。 C++で記述することはオススメできません。私の経験上、主に例外処理や STL の動作などが OS 依存で微妙に動作が変わることが多いです。ついで に、STL は処理性能が悪いです。 3.ファイル I/O ファイル I/O 処理(fopen)を使用する場合、fopen で指定するファイル名に ディレクトリ名を含めないようにしてください。 4.char 型 signed/unsigned を付与しない char 型は、Windows(VisualC++)の場合 signed char、Android(GCC)の場合 unsigned char になるので注意してください。 5.time_t 型 time_t 型は、Windows(VisualC++2005 以降)の場合 64bit、Android(GCC)の場 合 32bit なので注意してください。(現状、データモデルは両方とも ILP-32 で す) 6.推奨 C ランタイム C ランタイムは、Windows/Android 間で概ね同じ動作をします。 しかし、一部微妙に動作が異なるものがあります。 基本的に利用推奨ヘッダファイル以外のものは使わないようにすることを推 奨します。 7.VGEAPI グラフィックの描画、効果音の再生、BGM の再生、その他に VGEAPI を用い ることができます。VGEAPI の仕様については、本書の API リファレンスを参 照してください。 - 25 / 49 - 5. ROM データの作り方 5-1 データ構造 VGS で作られたプログラムを起動すると、 ROM データファイル(ROMDATA.BIN) から各種データを SLOT 領域という ROM 領域(読み込み専用領域)に展開します。 SLOT 領域は、グラフィックを格納する GSLOT、効果音を格納する ESLOT、音楽を 格納する BSLOT、任意バイナリデータを格納する DSLOT の 4 種類があり、 それ ぞれのスロットは、各 256 個あります。 SLOT-name Area Usage GSLOT 000~ 255 グラフィックのデータを格納する。 1SLOT に格納できるグラフィックは、最大 256x256 ピクセルの 256 色の CHR 形式(独自形式)データ。 ESLOT 000~ 255 効果音のデータを格納する。 効果音は、22050Hz、16bit、モノラルの PCM 形式(独自形式)データ。 BSLOT 000~ 255 波形メモリ音源の音楽のデータを格納する。 音楽は、BGM 形式(独自形式)データ。 000~ 255 任意のバイナリデータを格納する。 バイナリデータは、DAT 形式の任意のデータです。 例えば、ゲームのマップデータや各種パラメタ情報などを格納したい時に 使います。 DSLOT 5-2 CHR 形式データの作成 CHR 形式データは、最大 256x256 サイズの 256 色ビットマップ形式のファイルを vgsbmp コマンドで変換することで作成できます。 なお、縦若しくは横のサイズが 257 ピクセル以上 又は 256 色以外のビットマップ形式のファイル を vgsbmp コマン ドに指定すると失敗するので注意してください。 c:\test\Test01\romdata>vgsbmp usage: vgsbmp input(bmp) output(chr) c:\test\Test01\romdata>vgsbmp gslot000.bmp GSLOT000.CHR c:\test\Test01\romdata>dir gslot* ドライブ C のボリューム ラベルは Acer です ボリューム シリアル番号は CCFA-2A1F です c:\test\Test01\romdata のディレクトリ 2012/10/08 11:14 2012/10/08 13:51 2 個のファイル 66,614 gslot000.bmp 66,564 GSLOT000.CHR 133,178 バイト - 26 / 49 - 0 個のディレクトリ 250,271,776,768 バイトの空き領域 c:\test\Test01\romdata> 作成した CHR 形式データファイルは「GSLOTxxx.CHR」というファイル名で romdata ディレクトリ下に配置してください。 xxx の部分には 000~255 の範囲の十 進数の数字を指定してください。この数字が GSLOT のスロット番号になります。 プ ログラムでスプライトや背景を表示(vge_putSP, vge_putBG)する時、このスロット番号と 転送元座標、転送元サイズ、転送先座標を指定して矩形転送します。 なお、複数の GSLOT ファイルを配置した場合、パレット情報は一番スロット番号 が大きいもののパレットが全体のパレット情報になります。 VGS は、初期化時に GSLOT を展開した時の 256 色パレットの情報を後から変更することができないの で、全ての GSLOT のパレット情報は同じものにしてください。 ちなみに、SUZUKI PLAN が推奨するパレットは、サンプルで提供している gslot000.bmp で使われているパレット情報です。 このパレットがあれば、どんな絵 でも表現できると思います。 なお、サンプルで提供している gslot000.bmp は、フォ ントの画像情報が格納されています。 このフォントの画像情報は、美咲フォントという フリー提供されているものを SUZUKI PLAN が独自に加工したものを用いています。 サンプルで提供している gslot000.bmp 及び GSLOT000.CHR のライセンスは、美咲 フォントのライセンスに準じ、「商業利用可能+無保証」とさせていただきます。 5-3 PCM 形式データの作成 PCM 形式データは、周波数 22050Hz、ビットレート 16bit、チャネル数 1(モノラル) の wave 形式のファイルを vgswav コマンドで変換することで作成できます。 なお、 22050Hz 以外、16bit 以外又はステレオの wave 形式のファイル を vgswav コマンド に指定すると失敗するので注意してください。 c:\test\Test01\romdata>vgswav usage: vgswav input(wav) output(pcm) c:\test\Test01\romdata>vgswav eslot000.wav ESLOT000.PCM Header of eslot000.wav: - Format: 1 - Channel: 1ch - Sample: 22050Hz - Transform: 44100bps - Block-size: 2byte - Bit-rate: 16bit - PCM: 13888byte c:\test\Test01\romdata>dir eslot* ドライブ C のボリューム ラベルは Acer です - 27 / 49 - ボリューム シリアル番号は CCFA-2A1F です c:\test\Test01\romdata のディレクトリ 2012/10/08 14:25 13,896 ESLOT000.PCM 2012/10/08 11:14 14,104 eslot000.wav 2 個のファイル 28,000 バイト 0 個のディレクトリ 250,271,748,096 バイトの空き領域 c:\test\Test01\romdata> 作成した PCM 形式データファイルは「ESLOTxxx.PCM」というファイル名で romdata ディレクトリ下に配置してください。 xxx の部分には 000~255 の範囲の十 進数の数字を指定してください。この数字が ESLOT のスロット番号になります。 効 果音を再生/停止(vge_eff, vge_effstop)する時、 このスロット番号を指定します。 なお、VGS の場合異なる ESLOT の効果音を同時再生することができますが、同 じ ESLOT の効果音を再生した場合、直前の効果音を停止して新しい効果音を再 生します。 サンプルで提供している eslot000.wav 及び ESLOT000.PCM のライセンスは、CHR 形式のライセンスに準じ、「商業利用可能+無保証」とさせていただきます。 5-4 BGM 形式データの作成 BGM 形式データは、独自形式の mml(MusicMacroLanguage)ファイルを vgsmml コマンドでコンパイルすることで作成できます。 mml ファイルの書き方については、 「7. MML リファレンス」を参照してください。結構クセの大きいモノなので気をつけて ください。 c:\test\Test01\romdata>vgsmml usage: vgsmml mml-file bgm-file c:\test\Test01\romdata>vgsmml bslot000.mml BSLOT000.BGM c:\test\Test01\romdata>dir bslot* ドライブ C のボリューム ラベルは Acer です ボリューム シリアル番号は CCFA-2A1F です c:\test\Test01\romdata のディレクトリ 2012/10/08 14:34 59,248 BSLOT000.BGM 2012/10/08 11:14 7,037 bslot000.mml 2 個のファイル 66,285 バイト 0 個のディレクトリ 250,271,625,216 バイトの空き領域 c:\test\Test01\romdata> - 28 / 49 - 作成した BGM 形式データファイルは「BSLOTxxx.BGM」というファイル名で romdata ディレクトリ下に配置してください。 xxx の部分には 000~255 の範囲の十 進数の数字を指定してください。この数字が BSLOT のスロット番号になります。 音 楽を再生(vge_bplay)する時、このスロット番号を指定します。 サンプルで提供している bslot000.mml 及び BSLOT000.BGM のライセンスは、 CHR 形式のライセンスに準じ、「商業利用可能+無保証」とさせていただきます。 本当は、他の2つと違い、この BGM は SUZUKI PLAN で開発中の次回作ゲームで 使う予定の音楽なので、 他2ファイルと違うライセンス形態にすべき所なのですが、 そうしてしまうと色々と面倒なので、同一のライセンス形態としています。 もっと簡 単な著作権フリーの音楽でも良かったかもしれませんが、なるべく VGS の波形メモ リ音源のパワーを十分に発揮し、 尚且つカッコイイ曲にしておきたかった(世界一 カッコイイ Hello,World!を提供したかった)ので、そうしました。 もちろん、著作権を放 棄している訳ではないのでご注意ください。 5-5 DAT 形式データの作成 DAT 形式データは、任意のバイナリデータです。 作成した DAT 形式データファイルは「DSLOTxxx.DAT」というファイル名で romdata ディレクトリ下に配置してください。 xxx の部分には 000~255 の範囲の十進数の数 字を指定してください。この数字が DSLOT のスロット番号になります。 データを取 得(vge_getdata)する時、このスロット番号を指定します。 5-6 ROMDATA.BIN の作成 romdata ディレクトリ下に「GSLOTxxx.CHR」、「ESLOTxxx.PCM」、 「BSLOTxxx.BGM」、「DSLOTxxx.DAT」ファイルが配置された状態で、 windows ディ レクトリ下で「nmake rom」コマンドを実行することで、ROMDATA.BIN ファイルが生 成+配置されます。 Setting environment for using Microsoft Visual Studio 2010 x86 tools. C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>cd c:\test\Test01 c:\test\Test01>cd windows c:\test\Test01\windows>nmake rom Microsoft(R) Program Maintenance Utility Version 10.00.30319.01 Copyright (C) Microsoft Corporation. All rights reserved. C:\program2\VGS\bin\vgsrom ..\romdata ROMDATA.BIN write GSLOT000.CHR ... 66564 byte ... wrote write ESLOT000.PCM ... 13896 byte ... wrote write BSLOT000.BGM ... 59248 byte ... wrote copy ROMDATA.BIN ..\android\res\raw\romdata.bin - 29 / 49 - 1 個のファイルをコピーしました。 c:\test\Test01\windows> なお、romdata ディレクトリ下に「GSLOTxxx.CHR」、「ESLOTxxx.PCM」、 「BSLOTxxx.BGM」」、「DSLOTxxx.DAT」ファイル以外のファイルが配置されていて も無視されるので、 romdata ディレクトリ下にそれぞれのソースデータファイルを格 納しておいても問題ありません。 また、ソースデータから「GSLOTxxx.CHR」、 「ESLOTxxx.PCM」、「BSLOTxxx.BGM」」、「DSLOTxxx.DAT」ファイルを作成する makefile やバッチスクリプトなんかを作れば、 作業が楽になると思います。 - 30 / 49 - 6. API リファレンス 6-1 関数一覧 No. 分類 関数名 概要 1 入力 vge_touch タッチパネルの状態を取得 2 入力 vge_setPause ポーズ状態の設定・解除 3 スプライト描画 vge_putSP スプライトを表示 4 スプライト描画 vge_putSPH スプライトを表示(1/2 サイズ) 5 スプライト描画 vge_putSPM スプライトを表示(単色) 6 スプライト描画 vge_putSPMH スプライトを表示(単色+1/2 サイズ) 7 BG 描画 vge_putBG BG を表示 8 BG 描画 vge_putBG2 BG を表示(パレット 0 を非表示) 9 BG 描画 vge_clear BG をクリア 10 BG 描画 vge_scroll BG をスクロール 11 図形描画 vge_pixelBG vge_pixelSP 点を描画 12 図形描画 vge_lineBG vge_lineSP 線を描画 13 図形描画 vge_circleBG vge_circleSP 円を描画 14 図形描画 vge_boxBG vge_boxSP 矩形を描画 15 図形描画 vge_boxfBG vge_boxfSP 塗りつぶし矩形を描画 16 音声 vge_eff 効果音を再生 17 音声 vge_effstop 特定の効果音を停止 18 音声 vge_effstopA 全ての効果音を停止 19 音声 vge_bplay BGM を再生 20 音声 vge_bstop BGM を停止 21 音声 vge_bresume BGM を停止したところから再開 22 音声 vge_bfade BGM をフェードアウト 23 音声 vge_setmute 音声のミュート(無音)状態の設定・解除 24 音声 vge_getmute 音声のミュート(無音)状態の取得 - 31 / 49 - 25 数学 vge_sin サインを 256 倍にした整数を求める 26 数学 vge_cos コサインを 256 倍にした整数を求める 27 数学 vge_rad 2 点間の角度を 100 倍にしたラジアン値で求め る 28 数学 vge_kkd 2 点間の角度を求める 29 数学 vge_kkd2rad 角度を 100 倍にしたラジアン値に変換 30 数学 vge_rad2kkd 100 倍にしたラジアン値を角度に変換 31 数学 vge_rands 擬似乱数の初期化 32 数学 vge_rand 擬似乱数を求める 33 その他 vge_getdata DSLOT に格納されているデータを取得する 6-2 入力 (1) vge_touch Description タッチパネルの状態を取得します。 Prototype Arguments Return Remarks void vge_touch(int* s,int* cx,int* cy,int* dx,int* dy); - s [O] タッチパネルを押した状態か否か(非タッチ=0, タッチ中=0 以外) cx [O] 現在の X 座標(非タッチ中は不定) cy [O] 現在の Y 座標(非タッチ中は不定) dx [O] X 方向の移動距離(非タッチ中は不定) dy [O] Y 方向の移動距離(非タッチ中は不定) N/A プッシュ判定をする場合、直前フレームのタッチ状態を記憶し、現フレームのタッチ 状態と比較する必要があります。 また、非タッチ中の cx 及び cy は不定値なので、プッシュ判定座標は直前フレーム の cx 及び cy とする必要があります。 詳しくは、サンプルプログラムの vge_pause の実装を参考にしてください。 (2) vge_setPause Description ポーズ状態の設定・解除 Prototype void vge_setPause(unsigned char p); Arguments - p [I] ポーズ状態 (0=ポーズ解除する, 0 以外=ポーズする) Return N/A - 32 / 49 - Remarks vge_pause 中でポーズ状態を解除することを目的とした関数です。 一応、ポーズ状態の設定できますが、たぶん使わないと思います。 6-3 スプライト描画 (1) vge_putSP Description スプライトを表示 Prototype Arguments Return Remarks void vge_putSP(unsigned char n,int sx,int sy,int xs,int ys,int dx,int dy); - n [I] GSLOT のスロット番号 sx [I] スロット上の X 座標 sy [I] スロット上の Y 座標 xs [I] 幅 ys [I] 高さ dx [I] 表示位置(X 座標) dy [I] 表示位置(Y 座標) N/A スプライトは、パレット 0 が透明色になります。 また、BG との違いは、1 フレーム表示したら消える点です。 すぐに消える方がスプライト(妖精)、残る方が BG と覚えてください。 (2) vge_putSPH Description スプライトを表示(1/2 サイズ) サイズが 1/2 である点を除き、vge_putSP の仕様と同じです。 (3) vge_putSPM Descr iptio スプライトを表示(単色) n void vge_putSPM(unsigned char n,int sx,int sy,int xs,int ys,int dx,int Proto dy,unsigned char c); type Argu - n [I] GSLOT のスロット番号 ment - sx [I] スロット上の X 座標 s - sy [I] スロット上の Y 座標 - xs [I] 幅 - 33 / 49 - - ys [I] 高さ dx [I] 表示位置(X 座標) dy [I] 表示位置(Y 座標) c [I] 単色表示時のパレット番号 Retu N/A rn Rem arks 例えば、ダメージを受けたときに赤く点滅したりするときなどに使えます。 (4) vge_putSPMH Description スプライトを表示(1/2 サイズ) サイズが 1/2 である点を除き、vge_putSPM の仕様と同じです。 6-4 BG 描画 (1) vge_putBG Description BG を表示 Prototype Arguments Return Remarks void vge_putBG(unsigned char n,int sx,int sy,int xs,int ys,int dx,int dy); - n [I] GSLOT のスロット番号 sx [I] スロット上の X 座標 sy [I] スロット上の Y 座標 xs [I] 幅 ys [I] 高さ dx [I] 表示位置(X 座標) dy [I] 表示位置(Y 座標) N/A BG は、一度描画したらクリアされたり上書きしない限り消えません。 最近の CPU はかなり高速なので、全てスプライトで済ませても概ね問題無いです。 処理性能を稼ぎたいときは、BG を使った方が(VRAM へのメモリ転送回数が少なく なる分)高速にできます。 (2) vge_putBG2 Description BG を表示(パレット 0 を非表示) パレット 0 が非表示である点を除き、vge_putBG の仕様と同じです。 - 34 / 49 - (3) vge_clear Description BG をクリア Prototype Arguments Return void vge_clear(unsigned char c); - c [I] パレット番号 N/A (4) vge_scroll Description BG をスクロール Prototype Arguments Return Remarks void vge_scroll(int x,int y); - x [I] X 方向(正=右スクロール、負=左スクロール) - y [I] Y 方向(正=下スクロール、負=上スクロール) N/A スクロール後の領域はパレット 0 でクリアされます。 6-5 図形描画 (1) vge_pixelBG / vge_pixelSP Description 点を描画 Prototype Arguments Return Remarks void vge_pixelBG(int x,int y,unsigned char c); void vge_pixelSP(int x,int y,unsigned char c); - x [I] X 座標 - y [I] Y 座標 - c [I] パレット番号 N/A 図形描画系の関数は、BG 領域とスプライト領域(SP)の両方があります。 (2) vge_lineBG / vge_lineSP Description 線を描画 Prototype void vge_lineBG(int fx,int fy,int tx,int ty,unsigned char c); void vge_lineSP(int fx,int fy,int tx,int ty,unsigned char c); - 35 / 49 - Arguments Return - fx [I] X 座標(基点) fy [I] Y 座標(基点) tx [I] X 座標(終点) ty [I] Y 座標(終点) c [I] パレット番号 N/A (3) vge_circleBG / vge_circleSP Description 円を描画 Prototype Arguments Return void vge_circleBG(int x,int y,int r,unsigned char c); void vge_circleSP(int x,int y,int r,unsigned char c); - x y r c [I] [I] [I] [I] X 座標(基点) Y 座標(基点) 半径 パレット番号 N/A (4) vge_boxBG / vge_boxSP Description 矩形を描画 Prototype Arguments Return void vge_boxBG(int fx,int fy,int tx,int ty,unsigned char c); void vge_boxSP(int fx,int fy,int tx,int ty,unsigned char c); - fx [I] X 座標(基点) fy [I] Y 座標(基点) tx [I] X 座標(終点) ty [I] Y 座標(終点) c [I] パレット番号 N/A (5) vge_boxfBG / vge_boxfSP Description 塗りつぶし矩形を描画 領域を塗りつぶす点を除き、vge_boxBG/vge_boxSP と同じ仕様です。 - 36 / 49 - 6-6 音声 (1) vge_eff Description 効果音を再生 Prototype Arguments Return Remarks void vge_eff(unsigned char n); - n [I] ESLOT のスロット番号 N/A 効果音は、異なるスロットのものは合成再生されます。 同一スロットのものは後から再生した方が鳴ります。 (2) vge_effstop Description 特定の効果音を停止 Prototype Arguments Return void vge_effstop(unsigned char n); - n [I] ESLOT のスロット番号 N/A (3) vge_effstopA Description 全ての効果音を停止 Prototype Arguments Return void vge_effstopA(); N/A N/A (4) vge_bplay Description BGM を再生 Prototype Arguments Return void vge_bplay(unsigned char n); - n [I] BSLOT のスロット番号 N/A - 37 / 49 - (5) vge_bstop Description BGM を停止 Prototype Arguments Return void vge_bstop(); N/A N/A (6) vge_bresume Description BGM を停止したところから再開 Prototype Arguments Return void vge_bresume(); N/A N/A (7) vge_bfade Description BGM をフェードアウト Prototype void vge_bfade(unsigned int hz); - hz [I] マスターボリュームを下げる周期 Hz (※22050 で 1 秒周 Arguments 期) Return Remarks N/A マスターボリューム 10 の曲で 22050 を指定すれば 10 秒で消 音 (8) vge_setmute Description 音声のミュート(無音)状態の設定・解除 Prototype Arguments Return Remarks void vge_setmute(unsigned char n); - n [I] 非 0=ミュート、0=発音 N/A ミュートした場合、音が一切鳴らなくなります。 - 38 / 49 - (9) vge_getmute Description 音声のミュート(無音)状態の取得 Prototype Arguments Return unsigned char vge_getmute(); N/A 非 0=ミュート、0=発音 6-7 数学 VGS の数学関数は、全ての小数点を固定小数点方式で扱うので、C ランタイムの math よりもかなり高速です。 その分、精度が低いですが、ゲームの場合、精度より も性能が求められます。 なので、ゲームを作る場合は、VGS の数学関数を使って ください。 ゲームを作るのに必要な数学関数は、全て揃っている筈(ついでに、 math よりもゲーム向けに扱い易い筈)です。 (1) vge_sin Description サインを 256 倍にした整数を求める Prototype int vge_sin(int r); Arguments - r [I] ラジアン値を 100 倍にしたもの (0~627) Return サイン(r)を 256 倍にした整数 引数 r に 0 未満または 628 以上の値を指定した場合、自動的にフローリングします。 Remarks 性能的には自動フローリングしない方が高速なので、極力 0~627 の範囲で指定し てください。 (2) vge_cos Description コサインを 256 倍にした整数を求める Prototype Arguments Return int vge_cos(int r); - r [I] ラジアン値を 100 倍にしたもの (0~ 627) コサイン(r)を 256 倍にした整数 - 39 / 49 - Remarks 引数 r について、vge_sin と同様の注意あり。 (3) vge_rad Description 2 点間の角度を 100 倍にしたラジアン値で求める Prototype Arguments Return int vge_rad(int x1,int y1,int x2,int y2); - x1 y1 x2 y2 [I] [I] [I] [I] 点1の X 座標 点1の Y 座標 点2の X 座標 点2の Y 座標 2 点間の角度を 100 倍にしたラジアン値 (4) vge_kkd Description 2 点間の角度を求める Prototype Arguments Return int vge_kkd(int x1,int y1,int x2,int y2); - x1 y1 x2 y2 [I] [I] [I] [I] 点1の X 座標 点1の Y 座標 点2の X 座標 点2の Y 座標 角度(度数) (5) vge_kkd2rad Description 角度を 100 倍にしたラジアン値に変換 Prototype int vge_kkd2rad(int kkd); Arguments - kkd [I] 角度 Return 100 倍にしたラジアン値 (6) vge_rad2kkd Description 100 倍にしたラジアン値を角度に変換 Prototype int vge_rad2kkd(int rad); - 40 / 49 - Arguments - rad [I] 100 倍にしたラジアン値 Return 角度 (7) vge_rands Description 擬似乱数の初期化 Prototype Arguments Return Remarks void vge_rands(); N/A N/A vge_rand が返す結果を初期状態にする。 (8) vge_rand Description 擬似乱数を求める Prototype Arguments Return Remarks int vge_rand(); N/A 0 又は 31bit の正の整数(0~2147483647) 返す結果は、本関数の呼び出しの都度変化する。 vge_srand を発行することで、返す値を初期状態に戻すことができる。 一定の範囲の値が必要な場合、剰余演算を用いる。 - 例 1(0~99 の範囲): n = vge_rand() % 100; - 例 2(-50~49 の範囲: n = vge_rand() % 100 - 50; 6-8 その他 (1) vge_getdata Description DSLOT に格納されているデータを取得する Prototype Arguments Return const char* vge_getdata(unsigned char n,unsigned int* size); - n [I] DSLOT のスロット番号 - size [O] データサイズ 非 NULL=データの先頭ポインタ、NULL=指定スロットにデータは無い - 41 / 49 - Remarks 戻り値のポインタはアライメントを調整していない領域です。必要に応じて、アライメ ント調整をしてください。 例えば、構造体形式のバイナリデータを取得した場合、vge_getdata で取得した戻り 値が指す領域を、別に変数宣言した構造体領域へコピーをしてから参照するように してください。 ※アライメントの異なるデータポインタを参照した場合の動作は CPU の種類によっ て異なります(概ね、処理性能が劣化する or coredump で落ちる の何れかです) - 42 / 49 - 7. MML リファレンス 7-1 概要 MML(Music Macro Language)とは、マクロを用いて音楽(楽譜)を記述する言語で す。 VGS の MML は、一般的な MML と概ね互換性のある標準的な書式になって います。 7-2 マクロ VGS の MML ではマクロを定義できます。 $Hoge abcdefg $Hige (Hoge) (Hoge) $Hage (Hige) (Hige) 上記のように定義した場合、Hoge は「abcdefg」、Hige は「abcdefg abcdefg」、Hage は「abcdefg abcdefg abcdefg abcdefg」 という風になります。マクロを駆使することで、 連続した記述をシンプルに記述することができます。 なお、マクロの展開指定「(マクロ)」は、上の方の行で定義済みのマクロしか指定 できない点を注意してください。 7-3 チャネル VGS の波形メモリ音源は、6 チャネルです。MML では各チャネルの情報を「Ch0 xxxxx」~「Ch5 xxxxx」という形式のレコード(行)で定義します。 なお、チャネル 0(Ch0)のエンベロープ、ボリューム、比率は、若干意図しない形で 鳴る場合があります。 再生毎に変化する訳ではないので、これは仕様です。 7-4 オペランド チャネルレコードには、下表のオペランドを定義することができます。 オペランドは 大文字、小文字を区別しません。 オペランド間の区切り文字は不要です。 見難い 場合は、空白を入れるなどして調整してください。 Op 意味 M 数字 マスターボリュームを設定します。必ず最初の方に設定してください。 後の方で設定すると、適切にフェードアウトできない場合があります。 T 数字 テンポを設定します。必ず最初の方に設定してください。 後の方で設定すると、色々なものがズレる場合があります。 - 43 / 49 - 音色を選択します。 - 0: 三角波 @0~3 - 1: ノコギリ波 - 2: 矩形波 - 3: ノイズ V 数字 ベロシティーを設定します。 V+ ベロシティーを+の数だけインクリメントします。 V- ベロシティーを-の数だけデクリメントします。 オクターブを設定します。オクターブの上限/下限は、実際に聴いて確認してみてください。 O 数字 なお、VGS の波形メモリ音源は、高音が若干音痴かもしれません。 低音は割りとキレイです。 < オクターブをデクリメントします。 > オクターブをインクリメントします。 分解率の省略値を定義します。 分解率とは、1 なら全音符、2 なら半音符(2分音符)、3 なら 3 分音符、4 なら 4 分音符と いう具合です。 なお、VGS の波形メモリ音源では、存在しない分解率も指定できます。(3 分音符や L 数字 1000 分音符とか) また、分解率の後にドット(.)を付与することで、付点音符(1.5 倍の長さの音符)になります。 ※人間界には 0 分音符が存在しないので、人間界では指定しないでください %数字 キーオフのタイミングを設定します。例えば%50 で全音符を鳴らした場合、キーオフは 2 分音符分の長さの後になります。 \S 数字 キーオンしてから出力が最大になるまでの時間を Hz(1 秒は 22050Hz)で指定します。 (開始時エンベロープ) \E 数字 キーオフしてから消音状態になるまでの時間を Hz(1 秒は 22050Hz)で指定します。(終 了時エンベロープ) 自動ノートダウンする間隔を Hz(1 秒は 22050Hz)で指定します。 ノートダウンとは、半音単位で自動的に音程が低くなることです。 P-数字 ベースのスライド(ダウン)に相当する演出やドラム音を鳴らす時などに使います。 p-0 を設定すれば解除できます。 R[数 字] 休符です。数字は分解率です。省略時は L を参照します。 | ループです。1回だけ書けばそこを基点にループします。 なお、ループは必ずイントロで全音符以外のノート又は休符を最も沢山配置したチャネ ルに記載してください。 - 44 / 49 - 7-5 ノート チャネルレコードには、ノートを定義することができます。 ノートとは、「ドレミファソ ラシ」のことです。 ノートは英字表記で表記します(ドレミファソラシ=CDEFGAB)。 ノートはオペランドと同様、大文字、小文字を区別しません。 また、ノート・オペラン ド間の区切り文字は不要です。 見難い場合は、空白を入れるなどして調整してくだ さい。 ノートは、A 音の場合、次のように表記します。 A[+|-][[数字[^数字]...] •+|- : シャープ(+)またはフラット(b)の指定です。(省略時はナチュラルになり ます) •数字 : 分解率です。(オペランド L の説明を参照してください) •^数字 : タイを意味します(何個でも書けます) 7-6 例 $Brass \s600 \e22050 @1 %80 $Harp \s1000 \e1500 @0 %50 $Bass \s100 \e200 @2 %85 $Sq \s600 \e22050 @2 %75 $Sq2 \s6000 \e22050 @1 %80 $Hue \s5000 \e22050 @2 %80 $Osi \s22050 \e22050 @2 %80 $Osi2 \s12800 \e10000 @2 %80 $Ou \s500 \e5000 @2 %74 $B $S $H \s10 \e1000 p-128 @0 %10 v35 o3 \s1 \e1000 p-128 @3 %20 v20 o4 \s1 \e1000 p-64 @3 %75 v10 o2 #----------------------------------------------------------------------------# Bass #----------------------------------------------------------------------------Ch4 t172 m8 v12 (Bass) o2l16 Ch4 Ch4 Ch4 Ch4 d8.c+8.d8r8d8c+8d8 e8.d8.e8r8e8d8e8 f8.e8.f8r8f8e8f8 g8.f8.e8.d8.c8c+8 d8.c+8.d8r8d8c+8d8 e8.d8.e8r8e8d8e8 f8.e8.f8r8f8e8f8 r2 >p-384d2p-0< dd>dd<dd>dd<dd>dd<dd>dd< cc>cc<cc>cc<<b-b->b-b-<b-b->b-bcc>cc<cc>cc<cc>cc<cc>cc< dd>dd<dd>dd<dd>d<d>c<db-d Ch4 c8c8r8ccr8c8>c8<c8 d8d8>d8<d8r8d8>d8<d8 c8c8r8ccr8c8>c8<c8 Ch4 l8 dd>d<d>c<db-d4d>d<d>c<dcc+ Ch4 Ch4 Ch4 Ch4 l16 d8d8r8ddr8d8>d8<d8 c8c8>c8<c8>c8<c8d8e8 f8f8r8fff8f8r8ff f8frf8frf8frf8fr <b-8b-8b-8b-b->c8c8c8cc d8.g8.f8d8r8>p-256d4p-0< d8ddd8ddc8ccc8cc d8ddd8ddd8ddd8dd Ch4 Ch4 Ch4 Ch4 g8>gr<g8>gr<d8>dr<d8>dr< g8>gr<g8>gr<d8>dr<d8>dr< e8>er<e8>er<d8>dr<d8>dr< d8>dr<d8>dr<d8d8>d8<d8 g8g8>g8<g8r8d8>d8<d8 g8g8>g8<g8r8d8>d8<d8 a8ara8ara8ara8ar d8>dr<d8>dr<d8>dr<d8>dr< Ch4 g4.gg d4.dd g4.gg >d4.dd< a8aaa8aaa8aaa8aa d8ddd8dd dd>d<d>c<db-d Ch4 a8aaa8aa g8ggg8gg f+8f+f+f+8f+f+ e8eee8ee g8ggg8gg a8aaa8aa Ch4 d8ddd8dd dd>dd<dd>dd< #----------------------------------------------------------------------------# Melody #----------------------------------------------------------------------------- - 45 / 49 - Ch3 Ch3 Ch3 Ch3 Ch3 Ch3 (Osi)v5 l2drerfrecdrerfr1 (Brass) l8o4 v1rv14dfa > l16 d2r8d8e8f8 g4.fed2 e2r8e8f8g8 a2r8a8g8f8 g2r8g8f8e8 f8.e8.d8e8r4cd e2r8e8d8c8 d8.e8.f8.g8.a8b-8 a2r8<d8f8a8> d2r8d8e8f8 g4.fef4g4 a4.gfg4>c4< a2r8a8b-8>c8 d8.c8.<b-8>c4<g4 a4.gfd8r4de f2r8e8c8e8 d2r8 @2<d8f+8a8 Ch3 Ch3 Ch3 Ch3 Ch3 b4.aga4d4 b4.aga4>d4 e4.dc+d4<a4 f+2r8d8f+8a8 b4rbaga4d4 b4rbaga4>d4 c+4rc+def+4e4 d2<r8d8f+8a8 b4.aga4d4 b4.aga4>d4 c+4.def+4e4 d4e4f+4g4 a4ragf+g4d4 f+4rf+ede4<a4 b4rb>c+dc+4rc+de d2 l8o4@1 rdfa Ch2 Ch2 Ch2 Ch2 Ch2 Ch2 (Osi)v5 l2arb-r>c<rb-garb-r>cr1 (Brass) l8o2 v1rv13dfa > l16 d2r8d8e8f8 g4.fed2 e2r8e8f8g8 a2r8a8g8f8 g2r8g8f8e8 f8.e8.d8e8r4cd e2r8e8d8c8 d8.e8.f8.g8.a8b-8 a2r8<d8f8a8> d2r8d8e8f8 g4.fef4g4 a4.gfg4>c4< a2r8a8b-8>c8 d8.c8.<b-8>c4<g4 a4.gfd8r4de f2r8e8c8e8 d2r8 @0v++ d8f+8a8 Ch2 Ch2 Ch2 Ch2 Ch2 b4.aga4d4 b4.aga4>d4 e4.dc+d4<a4 f+2r8d8f+8a8 b4rbaga4d4 b4rbaga4>d4 c+4rc+def+4e4 d2<r8d8f+8a8 b4.aga4d4 b4.aga4>d4 c+4.def+4e4 d4e4f+4g4 a4ragf+g4d4 f+4rf+ede4<a4 b4rb>c+dc+4rc+de d2 l8o2@1v-- rdfa #----------------------------------------------------------------------------# Sub #----------------------------------------------------------------------------#********************** # Intro #********************** Ch1 Ch1 Ch1 Ch1 Ch1 (Sq)@1o4l16v10 da>df< v-- da>df< v-- da>df< v-- da>df< v++++++ eb->eg< v-- eb->eg< v-- eb->eg< v-- eb->eg< v++++++ f>cfa< v-- f>cfa< v-- f>cfa< v-- f>cfa< e v+ g v+ b-> v+ d v+ e v+ g v+ b- v+ >d < v- b- v- g v- e v- d< v- b- v- g v- ed Ch1 Ch1 Ch1 Ch1 o4l16v10 da>df< v-- da>df< v-- da>df< v-- da>df< v++++++ eb->eg< v-- eb->eg< v-- eb->eg< v-- eb->eg< v++++++ f>cfa< v-- f>cfa< v- f> c v- f v- a< v- f>v-cv-fv-a< v-a2 Ch1 o6l16v10 d<afd<afd<a Ch0 Ch0 Ch0 Ch0 Ch0 (Sq)@1o4l16v8 r32 da>df< v-- da>df< v-- da>df< v-- da>df< v++++++ eb->eg< v-- eb->eg< v-- eb->eg< v-- eb->eg< v++++++ f>cfa< v-- f>cfa< v-- f>cfa< v-- f>cfa< e v+ g v+ b-> v+ d v+ e v+ g v+ b- v+ >d < v- b- v- g v- e v- d< v- b- g ed Ch0 Ch0 Ch0 Ch0 o4l16v8 da>df< v-- da>df< v-- da>df< v-- da>df< v++++++ eb->eg< v-- eb->eg< v-- eb->eg< v-- eb->eg< v++++++ f>cfa< v-- f>cfa< v- f> c v- f v- a< v- f>v-cv-fa<a2 Ch0 o6l16v8 d<afd<afd<a32 #********************** # A melody 1 #********************** Ch1 Ch1 Ch1 Ch1 (Sq)@1 o4l16v12 a2r8a8g8f8 e8.d8.c8<b-4e4 gb->c4.r8c8d8e8 f4.fed2 c4.^32 l64 de fg ab->c2 l16 <a8.g8.f8g8r4ef g8.a8.b-8>c4e4 v- dafa v- dafa v- dafa v- dafa v- dafa v- dafa v++++++ @1 > d<afd<afd<a Ch0 Ch0 Ch0 Ch0 |(Sq) o3l16v10 f2r8f8g8a8 >c4.def2 g4.ab->c2 d2r8d8e8f8 e2r8g8f8e8 d8.e8.f8e8r4. < c2r8c8<b-8a8 f2d1^32 o6l16v10@1 d<afd<afd<a32 #********************** # A melody 2 - 46 / 49 - #********************** Ch1 o4l16 Ch1 f8.g8.a4.g8f8 e8.d8.c4.d8e8 f4rfgab-4a4 f2r8f8g8a8 b-4.>cde4c4 d8.e8.f8^4.fg a2r8g8e8c8 Ch1 d4.^32 l64 efga b->c l16 d2 Ch0 Ch0 Ch0 Ch0 o3l8(Sq)%50 a>afadafa< g>gegcgeg< fa>cfa>cfc (Sq)l16 < f4.fga4f4 d8.e8.f8g4>c4 d8.e8.f8^2 aga4.r8g8e8g8 f2r2 #********************** # B melody 1 #********************** Ch1 o5(Ou)@1%50l8 v8 Ch1 dbgbdaf+a dbgbdaf+a v10 %85l16 Ch1 gab4.r8a8f+8d8 < a4.^32 l64 b>c+def+g l16 a2 Ch1 g8.f+8.e8d4<a4 g4rgf+ef+4a4 a4rab>c+d4c+4 <d4.^32 l64 ef+gab>c+ l16 d2 Ch0 Ch0 Ch0 Ch0 o5(Ou)@1%50l8 v6 r16 dbgbdaf+a dbgbdaf+a16 < v8 %85l16 gab4.r8a8f+8d8 < a4.^32 l64 b>c+def+g l16 a2 g8.f+8.e8d4<a4 g4rgf+ef+4a4 a4rab>c+d4c+4 <d4.^32 l64 ef+gab>c+ l16 d2 #********************** # B melody 2 #********************** Ch1 g2f+2g2a2 Ch1 a>c+<ae c+ec+<a f+af+e c+ec+<a Ch1 > f+4g4a2 >c+4rc+<bab4g4 a4ragf+g4e4 d4rdef+ e4g4 f+2 Ch1 o6l16v10 d<afd<afd<a Ch0 Ch0 Ch0 Ch0 Ch0 > d1^2 f+2 < a>c+<ae c+ec+<a f+af+e c+ec+<a >> a4b4>d2 e4redc+d4<b4 >c+4rc+<bab4g4 g4rgab a4>c+4<a2 o6l16v8 d<afd<afd<a32 #----------------------------------------------------------------------------# Drums #----------------------------------------------------------------------------Ch5 l8 Ch5 (B)c(H)c(B)c(H)c(B)c(H)c(B)c(H)c Ch5 (B)c(H)c(B)c(H)c(B)c(H)c(B)cc Ch5 (B)c(H)c(B)c(H)c(B)c(H)c(B)c(H)c Ch5 (B)c(H)c(B)c(H)c(B)l16c8.cc8cc l8 Ch5 (B)c(H)c(B)c(H)c(B)c(H)c(B)c(H)c Ch5 (B)c(H)c(B)c(H)c(B)c(H)c(B)cc Ch5 (B)c(H)c(B)c(H)c(B)c(H)c(B)c4 Ch5 r2 l16 (S)ffeeddcc Ch5 Ch5 Ch5 Ch5 (B)c4(S)c8.(B)cc8c8(S)c4 (B)c4(S)c8.(B)cc8cc(S)c8(H)c8 (B)c4(S)c8.(B)cc8c8(S)c4 (B)c4(S)c8.(B)cc(S)c8.c8cc Ch5 Ch5 Ch5 Ch5 (B)c8c4cc c8c8(S)c4 (B)c8c4cc c8c8(S)c4 (B)c8c4cc c8c8(S)c4 (B)c8c8 (S)c8c8c32c32cccfedc l8 Ch5 (B)c(H)c(B)c(H)c(B)c(H)c(B)c(H)c Ch5 Ch5 Ch5 Ch5 (B)c(H)c(S)c(H)c(B)cc(S)c(H)c (B)c(H)c(S)c(H)c(B)c(H)c(S)c4 (B)c(H)c(S)c(H)c(B)cc(S)c(H)c (B)c(H)c(S)c(H)c(B)c l16(S)c8c8cc l8 Ch5 Ch5 Ch5 Ch5 (B)c(H)c(S)c(H)c(S)c(B)c(S)c(B)c l16 (B)c8.c8.c8(S)c4c8cc (B)c4(S)c8.(B)cc8c8(S)c4 (B)c4(S)c8.(B)cc(S)c8.c8cc Ch5 (B)c4(S)c8.(B)cc8c8(S)c4 Ch5 (B)c4(S)c8.(B)cc8cc(S)c8(H)c8 Ch5 (B)c4(S)c8.(B)cc8c8(S)c4 - 47 / 49 - Ch5 (B)c4(S)c8.(B)cc8(S)c8c8cc Ch5 Ch5 Ch5 Ch5 (B)c8c4ccc8c8(S)c4 (B)c8c4ccc8c8(S)c4 (B)c8c4ccc8c8(S)c4 (B)c8c8(S)c4c4c8cc Ch5 Ch5 Ch5 Ch5 Ch5 l8 (B)c(H)c(B)c(H)c(B)c(H)c(B)c(H)c (B)c(H)c(B)c(H)c(B)l16c8.cc8cc l8 (B)c(H)c(S)c(H)c(B)cc(S)c(H)c (B)c(H)c(S)c(H)c(B)c l16(S)c8c8cc l8 Ch5 Ch5 Ch5 Ch5 (B)c(H)c(S)c(H)c(B)cc(S)c(H)c (B)c(H)c(S)c(H)c(B)c(H)c(S)c4 l16 (B)c4.cc(S)c8(B)c8(S)c8(B)c8 (S)c8(B)c8(S)c8(B)c8 (S)cccc c32c32ccc - 48 / 49 - 8. 作者情報 •Company: SUZUKI PLAN •HomePage: http://hp.vector.co.jp/authors/VA040196/ •E-Mail: See contact.txt •Author: Yoji Suzuki -以上- - 49 / 49 -