musicLineアプリ開発日記

作曲を誰でも楽しく簡単に♪

【iOS】作曲画面の進捗報告 1

musicLine(iOS)についての進捗。
iOSの作曲画面が形になってきたので、現状を報告します。

作曲画面の動作

実装状況
  • ピアノロールの配置
  • 小節番号と小節線の表示
  • 分割線の表示
  • フレーズの表示
  • ボタンの配置
    → ボタンの処理は未実装。色はデフォルトです。
  • メロディーライン・音符の表示
  • リズム音符の表示
    → 画面外に音符が出ると消える不具合があります。
  • サンプルデータで音符を配置
    → 作曲データのファイル読み書きは未実装。
  • ピアノロールのスワイプにより、画面を上下移動
  • スクロールエリアのスワイプにより、画面を左右移動
    → スワイプ後の慣性移動の程度を調整する必要があります。
  • 音符の移動
    → 音符間の隣接制御(音符同士重ならないように)やフレーズの内包制御(フレーズの外に出ないように)をする必要があります。
  • ピンチアウト・インにより、画面を拡大・縮小
    → 現在は横・縦のみの拡大縮小に対応できていません。なお、拡大による分割線の変化は実装済み。


画面構成

画面構成

  • タイトルビュー
    曲のタイトル以外にもハンバーガーメニューやトラック番号・楽器を表示。
  • 再生モードビュー
    再生ボタンとソロボタン、再生モードを表示。
  • ツール選択ビュー
    ペン、指、消しゴム、フレーズ、スタンプツールからツールを選択する箇所。
  • ピアノロール
    ピアノを表示して音階を表示。
  • スクロールエリア
    左右のスワイプで小節をスクロールする領域。
  • メロディー編集エリア
    主にメロディを編集する領域。
  • リズム編集エリア
    主にリズムを編集する領域。


クラス構造

Viewのクラス図

作曲画面はCompositionViewをルートにして、SongViewで曲データの音符を表示、TransformViewで画面移動できるようにしています。
細分化したViewを階層的に表示して、Viewの役割を明確にしています。 以下にViewの役割を示します。

  • CompositionView
    作曲画面全体を表示。
    画面回転した時に検知して、レイアウト(縦・横)を変更します。
    曲の読み込み時にはインジケーター表示します。
  • TitleView
    タイトルビューの表示と制御。(トラックと楽器の表示も含む)
  • PlayModeView
    再生モードビューの表示と制御。
  • ToolSelectionView
    ツール選択ビューの表示と制御。
  • TransformView
    画面移動の制御。
    SwipeChangeModifirePinchChangeModifierを付与して、スワイプとピンチ操作で画面を動かします。
  • PianorollView
    ピアノロールの表示。
    鍵盤の番号を指定することで、白鍵盤のみにも対応しています。
  • SongView
    曲を表示。 小節や分割線も表示。
  • EditTrackView
    編集トラックの表示。 メロディの入力やリズムの分割の操作を制御します。
  • TrackView
    編集中以外のトラックの表示。
  • PhrasesView
    フレーズを表示。
    フレーズがないところには、フレーズ追加ボタンを表示します。
  • RhythmNotesView
    リズム音符の表示。
  • MelodyView
    メロディーラインの表示。
  • MelodyNotesView
    音符の表示。
    ドローコールを少なくするために、複数のフレーズの音符をまとめて表示。


おわりに

ドキュメントで仕様を残しても、実装段階で変わっていくのでメンテナンスも大変だし、あまりドキュメントは残さない主義でした。しかし、Androidでのアプリ制作の反省もあり、大規模になればなるほどドキュメントの重要性が身に沁みます。毎回、ソースコードを解読すればいいかという考え方でしたが、ある程度ドキュメントを残して、実装に合わせて更新していくほうが効率がいいと思いました。特に、クラスの関係図等は実装して内部構造が明確に頭にあるうちに、ドキュメントを作成・更新しておくべきだと思います。

今回は作曲画面の画面構成やクラス構成を図解し、ドキュメント化してみました。 ドキュメント化すると、画面名称やクラスの持ち方について違和感を感じる部分やもうちょっとどうにかならないかなと悩むところが出てきます。 また実装したり再考することで、仕様が変わるかもしれないですが、今後も報告を続けていきます。