Giter Club home page Giter Club logo

vgs2's Introduction

Video Game System mk-II SR

概要

  • Linux , Mac OS X , Windows , Android 及び iOS 対応のアプリを開発する SDK です
  • 全てのプラットフォームのゲームの実装を一本化できる特徴があります
  • 使用するプログラム言語は C/C++言語 のみです

アプリ開発の流れ

  • Linux , Mac OS X または Windows でアプリを開発し、完成後 Android 版をビルド、その後 iOS へポーティングという流れで開発します
  • VGSでは Linux , Mac OS X および Windows はサンドボックス環境という位置づけで扱います
  • vgs2mkpj コマンドでプロジェクトを作成
  • 自プロジェクトの game.c にゲームの処理を記述
    • vgs2_init : 初期化処理を記述
    • vgs2_loop : メインループの処理(1/60秒間隔で実行される)を記述
    • vgs2_pause : ポーズループの処理(ポーズ時に1/60秒間隔で実行される)を記述
    • vgs2_term : 終了時処理を記述
    • game.c 中では 標準関数、OSに依存しない独自関数、VGSのAPI関数 を使用できます
  • グラフィックと音のリソースを準備
    • GSLOTxxx.CHR に画像リソースを準備
    • ESLOTxxx.PCM に効果音リソースを準備
    • BSLOTxxx.BGM に音楽リソースを準備
    • DSLOTxxx.DAT に任意データリソースを準備
  • vgs2rom コマンドで ROMDATA.BIN を生成
  • ビルド(後述)

BGM機能だけ使いたい場合(Windowsのみ)

  • VGSのBGM機能だけ抜き出したDLLを libディレクトリ で提供しているので、そちらをお使いください。
  • このDLLのライセンスは後述のVGS本体のライセンスと同じです

ライセンス

  • 2-Clause BSDライセンスで提供しています
  • LICENSE.txtを参照してください
  • 本リポジトリに含まれるソースコードの 一部 若しくは 全部 を流用 又は VGS mk-II SRを用いて製作されたプログラムを配布又は販売する場合、プログラムの利用者が参照できるドキュメント(スマートフォンアプリの場合は公開するアプリストアに掲載される説明文 又は アプリ内で参照できるテキスト)に LICENSE.txt 記載の Copyright 表記を記載してください
  • 本リポジトリに含まれるソースコードの 一部 若しくは 全部 を流用 又は VGS mk-II SRを用いて製作されたプログラムを配布又は販売の結果発生した損失や損害等につき、当方は一切の責任を負わないものとします

OS別セットアップ・ビルド手順

以下のドキュメントを参照してください。

ROMDATA.BIN

VGSでは、グラフィックス、効果音、音楽、任意データ(ゲームのステージ情報など)を vgs2rom コマンドでロムデータ形式に結合したもの ( ROMDATA.BIN ) がゲームのアセット情報となります。

GSLOT (Graphics)

  • GSLOT000.bmpGSLOT255.bmp というファイル名で romdata ディレクトリに配置します
  • ファイル名の 000255vgs2_putBG関数vgs2_putSP関数 で指定する slot番号(n) に対応します
  • GSLOTxxx.bmp は 8bitカラー(256色) かつ 256 x 256 ピクセル以下のbitmap形式にする必要があります
  • 新しい GSLOTxxx.bmp を追加する場合, romdata/makefile ファイルを編集してください

ESLOT (Sound Effect)

  • ESLOT000.wavESLOT255.wav というファイル名で romdata ディレクトリに配置します
  • ファイル名の 000255vgs2_eff関数vgs2_effstop関数 で指定する slot番号(n) に対応します
  • ESLOTxxx.wav は 22050Hz, 16bit, 1ch(mono) の wav形式でなければなりません
  • 新しい ESLOTxxx.wav を追加する場合, romdata/makefile ファイルを編集してください

BSLOT (BGM)

  • BSLOT000.mmlBSLOT255.mml というファイル名で romdata ディレクトリに配置します
  • ファイル名の 000255vgs2_bplay関数 で指定する slot番号(n) に対応します
  • BSLOT000.mml は VGS独自形式の Music Macro Language です
  • MMLの書き方はMML.mdを参照してください
  • 新しい BSLOTxxx.mml を追加する場合, romdata/makefile ファイルを編集してください

DSLOT (Data)

  • DSLOT000.DATDSLOT255.dat というファイル名で romdata ディレクトリに配置します
  • ファイル名の 000255vgs2_getdata関数 で指定する slot番号(n) に対応します
  • DSLOTのファイル内容は不問です
  • マップデータ や キャラクタデータ など、任意形式のデータを VGSアプリ で用いる時に使います

romdata/makefile

romdata/makefile では以下の手続きを実行しています。

  • GSLOTxxx.bmpvgs2bmp コマンドで CHR 形式というVGS独自形式に変換
  • ESLOTxxx.wavvgs2wav コマンドで PCM 形式というVGS独自形式に変換
  • BSLOTxxx.mmlvgs2mml コマンドで BGM 形式というVGS独自形式に変換
  • GSLOTxxx.CHR , ESLOTxxx.PCM , BSLOTxxx.BGM , DSLOTxxx.DATvgs2rom コマンドで ROMDATA.BIN に結合

API仕様

API.md を参照してください。

Command仕様

Command.md を参照してください。

ハードウェア仕様

  • 最大同時発色数: 16777216色中256色
  • 解像度: 160 x 200
  • VRAM: スプライト1面 + BG1面
  • CPU
    • 現状 none-emulation (各対応OSのnative codeにcompile & 実行)
    • 将来的には独自の仮想CPUにしたい
    • 発想的には WebAssembly に近いので、WebAssembly の仕様がいい感じだったら乗っかるかもしれない(いい感じではなかったら、やはり独自開発する)
  • PPU
    • スプライト機能
      • GSLOTからの矩形転送
        • 回転
        • 1/2縮小(高速)
        • 任意サイズの拡大・縮小
        • マスク
      • 図形描画
    • BG機能
      • GSLOTからの矩形転送
      • 図形描画
      • ラスタスクロール
  • SPU(BGM音源): 初代SUZUKI PLAN - Video Game Systemと同じ
    • 全ストア型の波形メモリ音源
    • 音色数: 4 (三角波、ノコギリ波、矩形波、ノイズ)
    • チャネル数: 6
    • 周波数: 22050Hz
    • ビットレート: 16bit
    • モノラル
  • スロット仕様
    • グラフィックス(GSLOT): 最大256x256ピクセル x 最大256枚
    • 効果音(ESLOT): 22050Hz, 16bit, 1ch(モノラル) x 最大256個
    • BGM(BSLOT): 最大65,536ノート × 最大256個
    • データ(DSLOT): 任意データ × 最大256個

vgs2's People

Contributors

suzukiplan avatar

Stargazers

King (qpwakaba) avatar Hayaki Saito avatar Bing Locke avatar だいし avatar seb avatar

Watchers

James Cloos avatar Hayaki Saito avatar  avatar  avatar

Forkers

21km43

vgs2's Issues

vgs2pack command

概要

VGSのMMLデータ+metaデータからvgspack (正式名称は若干長いですが, SUZUKI PLAN - Video Game System / BGM package format ) を生成するコマンドを提供する。

経緯

東方BGM on VGS を iOS から Mac OS X へ単純移植したところリジェクトされてしまうという案件が発生した(詳細はこちらで詳述)。
本件指摘の対応策として、汎用的なVGSのBGMプレイヤーを提供しようと考えている。
その際, https://github.com/suzukiplan/Touhou-VGS-MML-data からインポートできる形式のデータを生成して、そいつを Dropbox なり ローカルファイル 経由でアプリへ喰わせれば良い感じにしたいと思っている。

meta data

1曲ごとに以下の情報を付与する。

  • format: BGM data format
  • genre: 曲の種別(以下のような大まかなもの)
    • game
    • classic
    • pops
    • rock
  • info: 複数の場合あり(二次創作の場合は2つ、三次創作なら3つ)
    • album: アルバム名(ゲームの場合はゲームタイトル)
    • origin: アルバムをリリースした国
    • copyright: アルバムのコピーライト(年)
    • right: 準拠する権利
    • code: 権利コード(例えばJASRAC管理楽曲なら管理番号や許諾番号)
    • song: 曲名
    • team: 所属サークル名・会社名・団体名など
    • composer or arranger: 作曲者 or 編曲者

meta tool

https://github.com/suzukiplan/Touhou-VGS-MML-data から東方BGM on VGSのmeta dataを自動的に出力するツール。(これは vgs2 リポジトリ ではなく Touhou-VGS-MML-data リポジトリ に突っ込んでおき、ワンコマンドで東方BGM on VGSの vgspack を出力できる状態にしておく)

Mac OS X support

  • 可能な限り手を抜きたい
  • Linux互換相当でいいんじゃないかと思う
  • ALSAについてはOpenALにしても良いかも(iOS版のコードをCで書いておいてあるのでほぼそのまま流用できると思うので)

ボリューム調整機能

ボリュームを動的に調整する機能を追加する

  • マスターボリューム
  • チャネル別の出力

なお、マスターボリュームは MML の Mオペランド とは別概念が良いんじゃないかなと思う。
パーセンテージ指定とか。

Linuxサポート

  • 私のAndroid開発環境をLinuxに移行した関係で、コマンド類(vgs2~)を全てLinuxで使えるようにしたい
  • 対応するのはコマンド類のみで、本体(エミュレータ)部分のLinux対応は不要(AndroidのみでOK)と考えている
  • そもそも、メリットが何も無いので...
  • Macは割とどうでも良い(GCCビルドに対応しておけば、多分Macでも使えるような気がしないでもない)

Crushes in iOS8

vgs2i.cのinit_openAL関数内で呼び出しているalcOpenDeviceでクラッシュします。
https://github.com/suzukiplan/vgs2/blob/master/template/vgs2i.c#L184
この問題はiOS7.x以前では発生せず、iOS8でのみ発生します。
正直どのように対策したものかと迷っています。
たぶん、iOS8のバグ(デグレード不良)だと思います。
本件の対策(回避策)についてPull Request募集中です。

この問題は初代VGSでも同様に発生します。
この問題を解決次第、SUZUKI PLAN製iPhoneアプリに修正をマージしてアプリをアップデートする予定です。

【この問題に該当するアプリ】

  • NOKOGI Rider
  • NOKOGI Rider Lite
  • Invader Block 2
  • 東方BGM on VGS
  • Battle Marine
  • Canon Sniper
  • Lunatic Clay
  • Lunatic Clay (FREE)
  • Invader Block 3

vgs2playの内部コマンド拡張

今のところ q(終了)のみですが、いろいろと拡充したい。
とりあず、思いついたものを書いてみる。

時間指定

Command : j { sec | min:sec }

で指定した再生時間にジャンプ。

時間指定オプション

$ vgs2play bgm-file [time]

みたいな感じで初期値のオプション指定も欲しいかも。

キーチェンジ(移調)

Command : k+ 数字
Command : k- 数字

特に実用性はないかもしれないが楽しそう。
(VGSに移調APIがあるので割と簡単に作れる)

特定チャネルのミュート

Command : mチャネル { on | off }

特定パートのみチェックしたい時とかに使いたい。

ポーズ/再開

Command : p

基本ですね。

リロード

Command : r

BGMファイル自体を読み直し、ミュートや移調の設定をクリアする。
割と重要(作業時)

iOS porting支援コマンド(vgs2iport command)

折角Mac OS X対応したので、VGSプロジェクトの内容をiOSポーティングするコマンドみたいなものを作りたい。(以下のような感じのものを想定)

$ vgs2iport  VGS-project-dir  iOS-project-dir

vgs2bgmライブラリ

about

  • VGSのBGMファイルを外部プログラムから色々するための共有ライブラリ
  • とりあえず、Windows版を作る
  • VBやC#とかから呼べる形にする

features

  • 初期化 / 終了
  • ロード / 解放 (ファイルからダイレクトにスロットに読み込む&解放する)
  • vgs2_bxxx(BGM関連のAPI全般)
  • レジスタ・スナップショット(現在の演奏状態を見れる感じの何か)

sound_threadの部品化

  • iOSとMac OS Xの実装内容が同じ(重複)
  • vgs2play と sandboxの実装内容が同じ(重複)
  • Linuxもインタフェースは共通化可能

という訳で、iOS, Mac OS X, Linuxのsound_threadの実装を一本化しておきたい。

効果音を鳴らす新API

概要

現状, vgs2_eff で raw PCM 形式の効果音を再生する機能があるが, そうではなく, もっとプログラマブルな形で効果音を鳴らす API が欲しい。

プログラマブルな形

以下のパラメラを引数で渡す感じで。
多分、以下のパターンだけでも結構それっぽくなると思う。

  • wave-pattern: triangle, square, saw, noise
  • length: Hz
  • scale
    • initial-value
    • direction: down, up
    • interval: Hz
  • volume
    • initial-value
    • direction: down, up
    • interval: Hz

API

シンプルにしたい。
チャネルの概念を入れれば複数の効果音を同時再生できるけど、同時再生は無くて良いかも。
スロット番号が若い方が優先度が高い。
という要求仕様を満たすには以下のような感じで良いんじゃないだろうか。

  • vgs2_peff_set(unsigned char slot, struct VgsPeParams* params);
    • パターンを登録
  • vgs2_peff_play(unsigned char slot);
    • 登録パターン(slot) を 再生
  • vgs2_peff_stop();
    • 止める

Visual Studio 2013対応

  • GetVersionExが使えなくなったので外す修正が必要。
  • 現状バージョンはログ表示に使っているだけで、別に要らないんじゃない?と思っている

vgs2rec command

BGMファイルをwavファイルへ変換して保存するコマンドが欲しい。
動画のBGM素材として使いたい時とかに役立ちそうなので。
ザックリと以下のような感じを想定

command line

vgs2rec  [{-t play-time | -l loop-time}] [-s sampling-rate] bgm-file

arguments

  • -t play-time : 演奏時間
  • -l loop-time : ループ回数 (1以上)
  • -s sampling-rate : サンプリング周波数
  • bgm-file : 変換対象のBGMファイル

memo

  • 非ループ曲の場合、play-time, loop-time は指定できない仕様で良いと思う
  • play-timeは「フェードアウトを挿入開始する時間」で良いと思う
  • play-time, loop-time 省略時は loop-time に 1 を指定したことを仮定
  • sampling-rate は要らないかも(仮に作る場合はデフォルト22050)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.