みなつ@プチコン

BASICでゲームが作れるWiiU/3DS用ソフト「プチコン」のブログです(*´▽`*)

音階解析プログラム

f:id:tksm372:20180212221414p:plain

公開キー【K3C3EE8E】(2017年6月14日公開)
3DSで実行するには、追加機能の「高度サウンドユニット」が必要です。WiiUプチコンには内蔵されています)

  • プチコンのマイクから入力した音をFFT(高速フーリエ変換)を使って周波数毎の音の強さ(音の周波数スペクトル)に変換し、音階を推定して表示プログラムです。
  • 公式ページにある「FFTサンプル」を参考にして作りました。
  • ピアノ等の単音であれば、そこそこ正しく認識します。通常の音楽だと、音成分がたくさん含まれているため、音階推定精度が落ちるため、耳コピの補助として使おうと思うと、もっと改良が必要かもしれません(´・ω・`)
  • すうさん(@suuhakase)が、なんと「ねこさんの絵を描く音楽」を演奏されて、そのMML版も作ってくださいました(*´▽`*) 
    Xボタンを押すとねこさんを描く音楽が再生され、こんな感じに音階で描かれた猫さんが見れます(≧∇≦)b

    f:id:tksm372:20180212222246p:plain

 

 


3DS/WiiU プチコン3号/BIG 用 音階解析プログラム

拡張版漢字変換辞書

f:id:tksm372:20180211230601p:plain

公開キー【43SXS4JD】(2017年3月21日公開)

なかくんさんの漢字入力FEP(フロントエンドプロセッサ)用の拡張版漢字変換辞書です。

  • ファイル名:_UUDB.MNT
  • 読み:28,133語(20,436語追加)
  • 漢字:45,234語(30,372語追加)

使い方

  1. なかくんさんの漢字入力FEPのプロジェクト「UTIL402」の中に_UUDB.MNTをダウンロードする。
    なかくんさんの漢字入力FEPはこちら :
    投稿プログラム : 日本語入力フロントエンドプロセッサ−漢字入力支援− - プチコン3号&BIGまとめWiki
  2. 「UTIL402」プロジェクト内の「UTIL.CFG」のDBファイ名を「_uUDB.MNT」に変更する (上の画像の反転してる行を御覧ください。)

辞書データは「pubdic+ 補遺 (私家版 えんどうさん)(ver.1.14)」を利用させて頂きました。

 

プチコンで作曲してみたよ~

f:id:tksm372:20180210031914p:plain公開キー【DAPRXTD】(2017年3月3日公開)

  • プチコンのサウンド機能は、8bit/16bit時代のBASIC搭載パソコンの表現に直すなら「16重和音PCM音源」と呼べるもので、非常に強力です。これを試さない手はないと思い、1曲作ってみました。
  • 作曲にはすごく興味があって、これまでいろいろ勉強はしてきたのですが、部分的なフレーズを作るところで終わってしまい、ちゃんとひとつの曲としてまとまったものは数曲しかなかったので、とにかく1ループするところまで作ることを目標に、がんばりました(*´▽`*)
  • ベースの音がちょっと小さい気がしたので、2トラック重ねました。
  • PSGっぽい音色は、デチューンでずらした2つの音(@147、矩形波でしょうか?)をユニゾンで演奏しています。ツインビーとかYsのPSGがこんな感じだったかな~と。
  • せっかく作ったけど、まだゲームには使ってないので、いつか使いたいと思います(≧∇≦)b

 

 
3DS/WiiU プチコン3号/BIG 用BGMその1

3Dポリゴンでマインクラフト風山歩き

f:id:tksm372:20180208231920p:plain

公開キー【KXJA4R3】(2017年3月5日公開)

これまでのスプライトを使った3D表現とは趣向を変えて、いわゆるPCやゲーム機で表現するのと同じやり方で、ポリゴンの山を描写してみました。山の中を歩けるだけで、掘ったり何かを置いたりはできません(*ノノ)

  • ポリゴンの表示は、GTRI命令で三角形を塗りつぶしています。
  • ゲームパッドで、カメラの方向を変えたり移動したりできます。
  • カメラ座標系への変換は、カメラ座標系のX,Y,Z3方向の単位ベクトルを用意して、ワールド座標(山のポリゴンの各頂点)の位置ベクトルと、3つの単位ベクトルの内積をとっています。三角関数等は不要で、内積を取る単純な掛け算と足し算だけで変換できます。
  • カメラ座標系に変換してしまえば、あとはこれまでやっていたのと同じく、カメラからのZ座標の値でX,Y座標の値を割り算するだけで、透視投影できます。
  • 本当はZ座標で手前と奥をクリッピングしないといけないのですが、これをやろうとすると三角形だったポリゴンが最大で5角形(三角形3つ)になるため、単純に「ポリゴンの頂点のZ座標が、どれかひとつでも閾値より手前に来たら、そのポリゴンは描画しない」という方法にしました(*ノノ)そのため、てまえのポリゴンがよく欠けます(; ̄▽ ̄)

 


3DS/WiiU プチコン3号/BIG 用デモ「3Dポリゴンでマインクラフト風山歩き」

スプライトでエフェクトをかけるサンプル

f:id:tksm372:20180207223702p:plain

公開キー【PK33XXA6】(2017年2月17日公開)

置きスプライト!

プチコンのスプライトは、昔ながらのスプライトのように定義した時点の画像がスプライト用のメモリに転送されるのではなく、毎フレーム毎にSPPAGEで指定したグラフィックページ(デフォルトでGRP4)の画像を参照して、スプライトが描画されます。ポリゴンのテクスチャみたいな感じですね。そのため、一旦SPSETやSPOFSでスプライトを表示することにしておけば、グラフィックページを書き換えるだけでスプライトに表示される画像も更新されます。私はこれを勝手に「置きスプライト」と呼んでいます(*´▽`*)

そこで、置きスプライトを使って、グラフィック用のページに描かれた画像に、無負荷でリアルタイムにエフェクトをかけるサンプルを作ってみました。

各効果の解説

  1. ぼかし
    SPCOLORで半透明にしたスプライトを、上下左右斜めの8方向に1ドットずつずらして重ね合わせると、ぼかたようなの効果になります。
  2. ふちどり
    SPCOLORで色を付けたスプライト(透明度は不透明のまま)、上下左右斜めの8方向に1ドットずつずらして重ね合わせると、ふちどりの効果になります。
  3. ドロップシャドウ
    SPCOLORで半透明、かつ黒っぽい色にしたスプライトを、少し斜め下にずらして重ね合わせると、ドロップシャドウのような効果になります。

おわりに

置きスプライトの最大の利点は、単にスプライトの機能を使っているだけなので、余分な負荷が一切かからないところにあります。もちろん、グラフィックに描いたものにしか効果がないため、グラフィック自体を更新する負荷はかかりますが、その分を差し引いても、面白い効果が得られるんじゃないかと思います。

あと、SPSCALEで拡大すれば、レンズのような効果も得られます。例えば、プチコンの上画面の標準解像度は400x240ですが、縦横2倍、4倍に拡大して200x120ドットや100x60ドットの解像度に落とすと、更新しなければいけないピクセルの総数が1/4や1/16というふうに大幅に減るので、毎フレーム全画面を書き換えるような力技のゲームも作成可能かもしれません(   ̄▽ ̄)

 


3DS/WiiU プチコン3号/BIG 用デモ「スプライトを使ったエフェクト」

つるつるバルーン

f:id:tksm372:20180207022816p:plain

公開キー【N33PJ4ZD】(2017年2月15日)

  • 「3Dまっぷ」の処理を最適化して、一応遊べるゲームにしたのが、このつるつるバルーンです(*´▽`*)
  • 床がつるつる滑る中、風船を全部集めるとステージクリアです。
  • 初めて公式ページのユーザー作品に投稿しました!
  • ステージを作るのがしんどくて・・・3面までしかできていません。これも、そのうち増やしたいかも@@;
  • なお、3面はF1で有名なモ〇コステージとなっております(   ̄▽ ̄)

    f:id:tksm372:20180207023326p:plain

  • どちらかというと技術先行といいますが、インパクト重視の作品だったので、プレイアビリティがよくないかも・・・あんまり滑らないモードとか、もう少しいろんな人に楽しんでもらえるような工夫が必要ですねー(´・ω・`)

 


Nintendo 3DS/WiiU プチコン3号/BIG(SmileBasic)用ゲーム「つるつるばるーん」

3Dまっぷ v1.31

f:id:tksm372:20180206010718p:plain

公開キー【N34444J3】(2017年2月5日公開)

  • 幅1ドットのスプライトをスクリーンの横幅(400ドット)分だけ用意して、カメラから壁までの距離を計算して壁の高さを割れば、3D表示できちゃうんじゃない!?と思って、おもむろにつくり始めたのがコレでした。
  • 後から調べたら、Ray Caster(視点から光を投げて、壁に当たるまでの距離を計算して描画する)という、すでに存在する手法でした(´・ω・`)
  • カメラから壁までの距離を、いかに少ない計算量で求めるかがポイントでした。
  • 「視線と壁の交点を1点計算したら、壁の横幅分は視線を再走査せずにスキップする」という改良を行ったところ、かなり速くなったのですが、これだと「見つけた壁より手前に覆いかぶさって壁」もスキップしてしまう場合があるという問題があり、結局「一旦左から右へ走査し、その後右から左にも走査しなおす」という2パスにすることで、解決しました。
  • 地面は、前回の「地面を表示するプログラム」の手法でやっていますが、ここが負荷のかなりの部分を占めるため、次のバージョン(未公開のv1.40)で
    1.ミップマップのように遠景ほど解像度を荒くする
    2.壁に隠れている部分は描画しない
    という改良を行った結果、なんとかゲームに使える速度になり、後のつるつるバルーンを作るきっかけになりました(*´▽`*)

 


3DS/WiiU プチコン3号/BIG 用デモ「3DMAP v1.31」