ToyTone for iOSをリリースしました

iOS用の楽器アプリです。
ゲームの効果音みたいのが得意です。

ToyTone for iOS
https://itunes.apple.com/jp/app/toytone/id1016447265?mt=8

1. Swiftを使った感想

今回、初めてSwiftを使ってみたのですが、
個人的にはC#に似てるなーっていう印象でした。
ただ、Swiftの文法もUIKitもすべて初めてだったので、
何をやるんでも調べながらで時間が掛かりました。

2. 音源部の実装

選択肢としては、
AVAudioEngine, AudioUnit, Audio Queue Servicesがあって、
今回はレイテンシーを縮められるAudio Queue Servicesを使用しました。
けど、Swiftだとコールバック設定する方法が分からなかったので、
SwiftでUIを書いて、Obj-Cでラッパーを書いて、音源部分はCで記述しました。
Swiftにおけるパフォーマンスチューニングはさっぱりだったので、
そういうのを気にしないためにも初めからCで書くと決めてました。
結果的にパフォーマンスに関しては何も考えずに実装できました。

3. 音源の設計

昔持ってた効果音の鳴るキーホルダーを思い出して、
これに似たものを作ろうと思ってたのですが、
途中でシンセドラムっぽい音を作りたくなって、
さらに、LFOの周波数もモジュレーションしたくなって、
結果的に、こんな感じになりました。

1VCO + 1LFO + 3EG

でも、スライダーを置くスペースが足りなくなったので、
いじれるパラメータを厳選して、今回のようなUIにしました。

4. パラメータの設計

実は、この部分が一番難しくて、この辺はいろいろ内緒です。
こんな感じの式を使って、グラフを見て、耳で確認して調整しました。

y = ax + bx^2 // 0〜256
y = ax + bx^3 // -128〜+128

5. UIの設計

一般的にツマミを真似したものが多い訳ですが、
今回はスライダーで実装しました。
スライダーの欠点は場所を取ることですね。
ツマミだったらもっとたくさんのパラメータをいじれるように出来たのですが、
つまめないのにツマミとかツマミに対する冒涜だ!
っていう屁理屈でスライダーにした訳ですが、次回はツマミも検討してみます。
あと、何より微調整が難しい感じになってしまったので、
左右のラベルに-1/+1をする機能を割り当ててみました。
ヘルプ的なものがないのは、単なる横着です。

6. まとめ

Perlで一通り実装したことがあったので、
音源部分はすぐに完成しました。
パラメータの追い込みはまた別で、血を吐きそうになりました。
UIKitに関しては、まったくのド素人だったので、
まず、この辺を調べながらSwiftの勉強に1ヶ月近く掛かった気がします。
音源部分とパラメータの追い込みはそれぞれ1週間くらいですね。
本業の合間で作業したので、作業期間はもっと長いかも知れないです。
一番長く感じたのは、審査が始まるまでの期間ですけどね!

7. おまけ

いろいろバグっぽい挙動を残しています。
桁あふれや、エイリアスが発生するので、普通のシンセでは出ない音が多々出ます。
パッドを押しっぱなしにすると、桁あふれして壊れたみたいな音が出るのですが、
これについては自分で探して貰えればと思います。

あと、お世話になったCPANモジュールは以下の通りです。

  • Imager
  • Math::Random::NormalDistribution
  • Text::Xslate

おしまい。

Leave a Comment