ドを叩くとドって喋るピアノアプリを作ってみました
はじめに(自分語り)
高校生くらいの頃から趣味で楽器演奏を始め、早10年くらいが経ちました。
経験年数に比例してスキルもどんどん上達・・・と言いたいところでしたが、そこそこのレベルで次第に頭打ち感(?)を感じ始め、
「やっぱりもっと幼少期から音楽に触れていたら良かったな」なんて言い訳がましいことを思ったりしていました。
そんなある日、ピアノアレンジ解説動画で巷で有名な(?)ずっしーさんのある記事をふと読み、
「『移動ド唱法』を身につければきっと音楽ライフが豊かになるはず!!」と思い、これの習得を目指し始めました。
そんな中、もし「階名の音声が鳴るピアノアプリ」があったら、メロディと階名を結びつける練習に役立ちそうだなーと思い、
調べたところ世間にはまだそういうアプリがなさそうだったので、
アプリ開発の実績を作りたかったということもあり、
そういうアプリを作ってみました。
ちなみにiOSアプリ開発は初だったのですが、せっかくなので
話題のSwiftUIを利用して、いろいろ調べながら勉強しながら作成しました。
特徴
- ピアノのそれぞれの鍵が階名に対応
- 「ド」を叩くとCの音高で「ド」って言ってくれる
- トランスポーズ(ピッチ変更)機能
- Pitch = +7(Gmaj) に設定した場合、「ド」を叩くとGの音高で「ド」って言ってくれるようになる
- 各鍵に階名と音名を併記
- Pitch = 0 の場合、「ド」の鍵には「ド」「С」と表示
- Pitch = +7 の場合、「ド」の鍵には「ド」「G」と表示
- いわゆる「黒鍵」の階名は西塚式で記載(デ、リ、フィ、サ、チ)
- 声の種類を自由に変更できる仕組み(※変更方法は後述)
- デモ音源として桃音モモさんの音声を使用させていただきました
簡単な音声付き動画をTwitterに上げてみました。
問題
音声ファイルの再生にやや遅延があり、ピアノアプリと言うにはやや残念なUXを提供します。
私の現状のSwift力ではこれが限界でした。
もっと素早くレスポンスを返す方法をご存知の方がいらっしゃいましたら、ぜひ教えてください泣
導入
開発当初はApp Storeで公開しようかなとも思っていましたが、諸々検討の結果Githubに公開するに留めることとしました。
おう試してみてやるよって人は、Cloneの後Xcodeで開いてぜひ実行してみてください。
- Githubのリポジトリ
DoremiPiano - 実機に入れて遊ぶ場合の参考記事
AppleDeveloperProgramに登録不要!!実機ビルドする方法
音声ファイル設定方法
- 「ドーー」という音声のファイル(音高はCでなくても良い)を準備する
- 同様に、「デーー」「レーー」「リーー」...「シーー」の計12種類の音声ファイルをそれぞれ用意する
- 音高は任意だが、目的の音高に近い音であるほど良い(自然な声になる)
- オクターブ違いの音声など、12種類以上用意しても良い
- noteData.jsonという名称のファイルを作成し、以下のようなフォーマットで各音声ファイルの情報を記述する
[
{
"id": 67, // 一意となる番号。defaultRoleと同じで良い
"audioName": "67soA3", // 用意した音声ファイルの名前(任意)
"type": "wav", // 用意した音声ファイルの拡張子
"audioPitch": 69.3, // 用意した音声ファイルの音高(鍵番号に対応したFloat値。デバッグしながら調整しよう)
"defaultRole": 67 // 対応させたい鍵の番号(A4 = 440Hz = 69とする番号。MIDI界隈でノートナンバーと呼ばれるやつ)。67〜88をそれぞれ設定する
},
...
{
"id": 88,
"audioName": "88miC#5",
"type": "wav",
"audioPitch": 84.7,
"defaultRole": 88
}
]
- Resourcesフォルダに追加する
- 実行して、音を確かめる。音が高すぎたらdefaultRoleを適宜大きく設定し直す
- アプリ画面からの変更機能は現状ないので、jsonファイルを直接変更する必要がある
おわりに(自分語り)
レスポンスの遅さの都合上、移動ド唱法トレーニングに実際に活用するのは難しそうですが、
IT屋さんスキルという意味では、アプリの設計〜テストまで一通り経験できたので
個人的にはひとまず満足しています。
機会と能力が許せば、今後改良を加えていこうと思います。
おことわり
本記事は技術ブログサービスQrunchのサービス終了に伴い移行したものです。
執筆時の日時は2020-07-18 11:54:30 +0900であり、記載内容は現在の状況と異なる可能性がありますのでご注意ください。
Discussion