atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
Lib UTAU ヘルプ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
Lib UTAU ヘルプ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
Lib UTAU ヘルプ
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • Lib UTAU ヘルプ
  • 解説

Lib UTAU ヘルプ

解説

最終更新:2011年05月08日 15:18

libutau

- view
管理者のみ編集可

  • サンプルプログラムの解説
  • まずは TUtauData
  • [#SETTING] セクションの管理
  • 音符セクションの管理
  • パイプファイルのバージョン間の相違を吸収
  • 値の設定
  • パイプファイルへの書き戻し
  • 追記予定

サンプルプログラムの解説


 Lib UTAU に同梱してあるサンプルプログラムについて、その内容を解説します。

 なお、ここで引用しているのはダイジェスト版であり、一部のプログラムコードが省略されています。

まずは TUtauData


  1. int main(int oArgC, char* oArgV[])
  2. {
  3. // パイプファイルの内容全体を管理するクラス
  4. TUtauData aUtauData;
  5.  
  6. // パイプファイルの内容を読み込む
  7. if ( aUtauData.SetTo(oArgV[1]) != B_OK ) {
  8. echo("パイプファイルを読み込めません。");
  9. return -1;
  10. }
  11.  

 Lib UTAU の中心となるクラスは TUtauData であり、UTAU 本体から受け取るパイプファイルの内容をすべて管理するクラスです。

 Lib UTAU を利用する場合、まずは TUtauData のインスタンスを生成するところから始めます(4 行目)。

 続いて、SetTo() 関数でパイプファイルの内容をすべて読み込みます(7 行目)。UTAU 本体からプラグインへ、パイプファイル名がコマンドライン引数として渡されますので、そのファイル名を SetTo() 関数に渡します。

 Lib UTAU 全体を通じて言えることですが、文字列は全て、マルチバイト文字(char)です。ワイド文字(wchar_t)ではありません。ファイル名もマルチバイト文字で渡して下さい。

 SetTo() 関数は正常にパイプファイルを読み込めると、定数 B_OK を返してくるので、B_OK 以外が返ってきた場合はエラーとしてプログラムを終了します。

[#SETTING] セクションの管理


  1. // [#SETTING] セクションの内容を管理するクラス
  2. const TUtauSectionSettings* aSettings;
  3. aSettings = aUtauData.SectionSettings();
  4.  
  5. // [#SETTING] セクションからテンポ(double 型)を取得してみる
  6. double aTempo;
  7. if ( aSettings->GetValue(KEY_NAME_TEMPO, &aTempo) == B_OK ) {
  8. echo("テンポを取得できました:"+num_to_string(aTempo));
  9. } else {
  10. echo("テンポが設定されていません。");
  11. }
  12.  

 最初に、パイプファイルの [#SETTING] セクションの情報を取得してみましょう。

 [#SETTING] セクションを管理するクラスは TUtauSectionSettings です。TUtauData::SectionSettings() 関数で、TUtauSectionSettings へのポインタを取得できます(3 行目)。

 [#SETTING] セクションはリードオンリーなので、TUtauSectionSettings のポインタ変数を宣言する際は const 付きにしておいて下さい。

 [#SETTING] セクションに記録されている情報を取得するには、GetValue() 関数を使います(7 行目)。

 GetValue() の第 1 引数は、取得したい情報の名称です。テンポを取得する時は KEY_NAME_TEMPO を渡します。KEY_NAME_TEMPO は Lib UTAU で定義されている定数で、実体は "Tempo" です。パイプファイルの中身は「Tempo=120.00」などとなっていますが、ここの名称をそのまま渡せば情報を取得できるということです。

 GetValue() の第 2 引数は、取得した値の格納場所です。テンポは小数なので、double 型変数へのポインタを渡すことで、この変数にテンポが格納されます。

 8 行目では、取得したテンポを表示しています。echo() 関数は Lib UTAU の関数ではなく、サンプルプログラムで定義している関数です。通常なら cout で良いのですが、ライブラリ作者の環境ですと、cout だと UTAU から起動された場合に値が表示されなかったので、echo() 関数内でメッセージボックスを表示しています。

 num_to_string() 関数は Lib UTAU のサポート関数で、数値を文字列(string 型)に変換します。boost が使える環境でしたら、lexical_cast<string> 使えばいいだけなのですけどね。

音符セクションの管理


  1. // 音符セクション([#0001] など)の内容を管理するクラス
  2. TUtauSectionNote* aNote;
  3.  
  4. // UTAU で選択されている音符の歌詞(string 型)をすべて取得してみる
  5. string aLyric;
  6. string aAllLyric;
  7. for ( int32 i = aUtauData.SectionNotesNormalBegin() ; i < aUtauData.SectionNotesNormalEnd() ; i++ ) {
  8. aNote = aUtauData.SectionNoteAt(i);
  9. if ( aNote->GetValue(KEY_NAME_LYRIC, &aLyric) == B_OK ) {
  10. aAllLyric += aLyric;
  11. } else {
  12. echo("インデックス "+num_to_string(i)+" の歌詞が設定されていません。");
  13. }
  14. }
  15. echo("歌詞:"+aAllLyric);
  16.  

 それでは、パイプファイルの音符セクション([#0001] など)の情報を取得してみましょう。UTAU 本体で選択されているすべての音符の歌詞を繋げてみます。

 音符セクションを管理するクラスは TUtauSectionNote です。パイプファイルにはたくさんの音符セクションが並んでいますが、TUtauData::SectionNoteAt() 関数で、TUtauSectionNote へのポインタを取得できます(8 行目)。引数は、何番目の音符セクションかを示すインデックスで、0 から始まります。つまり、SectionNoteAt(0) で最初の音符セクションを取得できます。

 したがって、SectionNoteAt(0)、SectionNoteAt(1)……SectionNoteAt(セクションの数-1) というように順に音符セクションを取得していけば、すべての音符セクションにアクセスできます。

 ここで注意が必要なのは、[#PREV] セクションの存在です。ご承知の通り、[#PREV] は選択されている音符の前の音符を示します。

 SectionNoteAt(0) が返す値は [#PREV] の可能性があります。[#PREV] セクションが不要な場合は、SectionNotesNormalBegin() 関数の出番です(7 行目)。この関数は、[#PREV] セクションを除いた最初のセクションのインデックスを返します。したがって、SectionNoteAt(SectionNotesNormalBegin()) で、[#PREV] セクションを除いた最初の音符セクションを取得することができます。

 同様のことが末尾の [#NEXT] セクションについても言えます。そして、SectionNotesNormalEnd() 関数が、[#NEXT] セクションを除いたインデックスの最大値です。

 SectionNotesNormalEnd() は STL の end() と同様に有効値の次の値を返すことに注意して下さい。つまり、SectionNoteAt(SectionNotesNormalEnd()) は不正です。SectionNoteAt(SectionNotesNormalEnd()-1) が末尾の音符セクションです。

 さて、無事に先頭と末尾のインデックスが分かったので、7~14 行目のループに入ります。

 ループの中で各音符の歌詞を取得していますが、歌詞の取得は GetValue() 関数です。

 [#SETTING] セクションでテンポを取得した時も GetValue() 関数を使いました。関数名が同じなのは偶然でも何でもなく、実は、TUtauSectionSettings も TUtauSectionNote も、同じ TUtauSection クラスから派生しています。GetValue() 関数は TUtauSection クラスの関数なのです。

 したがって、テンポの取得も歌詞の取得もやり方は変わりませんので、解説は省略します。テンポの時と違うのは、歌詞は文字列なので、第 2 引数に string 型へのポインタを渡しています。

パイプファイルのバージョン間の相違を吸収


  1. // パイプファイルのバージョンを管理するクラス
  2. const TUtauSectionVersion* aVersion;
  3. aVersion = aUtauData.SectionVersion();
  4.  
  5. // 最初の音符のモジュレーション(int32 型)を取得してみる
  6. // UTAU 0.2.90(キー名は "Modulation")でも UTAU 0.2.75(キー名は "Moduration")でも取得できるようにする
  7. int32 aMod;
  8. aNote = aUtauData.SectionNoteAt(aUtauData.SectionNotesNormalBegin());
  9. if ( aNote->GetValue(aVersion->CompatibilityKey(KEY_NAME_MODULATION), &aMod) == B_OK ) {
  10. echo("モジュレーションを取得できました:"+num_to_string(aMod));
  11. } else {
  12. echo("モジュレーションが設定されていません。");
  13. }
  14.  

 次に、[#VERSION] セクションの管理について解説します。

 [#VERSION] セクションを管理するクラスは TUtauSectionVersion です。TUtauData::SectionVersion() 関数で、TUtauSectionVersion へのポインタを取得できます(3 行目)。

 [#VERSION] セクションはリードオンリーなので(UTAU の仕様上リードオンリーなのかは不明ですが、Lib UTAU ではリードオンリーとして扱っています)、TUtauSectionVersion のポインタ変数を宣言する際は const 付きにしておいて下さい。

 さて、UTAU のバージョン(パイプファイルのバージョン)によって、パイプファイルの記述が少しずつ変わってきます。差異を考慮してプログラムを組むのは大変ですが、TUtauSectionVersion は、差異吸収作業を手助けする機能を持っています。

 それが CompatibilityKey() 関数です。CompatibilityKey() は、最新の UTAU でのキー名を渡すと、現在読み込んでいるパイプファイルのバージョンに合わせたキー名を返してくれます。

 例えば、モジュレーションは、UTAU 0.2.90 では "Modulation" ですが、UTAU 0.2.75 では "Moduration" です(l と r の違い)。

 CompatibilityKey() に最新の "Modulation" を表す KEY_NAME_MODULATION を渡し、CompatibilityKey(KEY_NAME_MODULATION) とすると、UTAU 0.2.90 のパイプファイルを読み込んでいる場合は KEY_NAME_MODULATION が返り、UTAU 0.2.75 のパイプファイルを読み込んでいる場合は KEY_NAME_MODURATION が返ります。

 つまり、音符セクションからモジュレーションを取得する際、GetValue(aVersion->CompatibilityKey(KEY_NAME_MODULATION), &aMod) とすることで、UTAU 0.2.90 だろうと UTAU 0.2.75 だろうと気にせず、モジュレーションの値を取得することができます(9 行目)。

 なお、モジュレーションは整数なので、GetValue() の第 2 引数には int32 型へのポインタを渡しています。int32 は要するに long です。short や long だと型の大きさが直感的に分かりづらいので、Lib UTAU では int8、int16、int32 というような表記を用いています。

 実のところ、現在、CompatibilityKey() は KEY_NAME_MODULATION を変換する機能しかありません。なんとなく、他にもバージョン間で差異のあるプロパティはある気がしていますが、いまいち把握できていないので、実装できていません。コメント投稿ページで差異を具体的に教えていただければ(UTAU のバージョンとプロパティ名など)、対応を検討させていただきます(必ずしも対応できるとは限りません)。

値の設定


  1. // UTAU で選択されている音符の音の強さ(int32 型)をすべて半分にする
  2. int32 aIntensity;
  3. for ( int32 i = aUtauData.SectionNotesNormalBegin() ; i < aUtauData.SectionNotesNormalEnd() ; i++ ) {
  4. aNote = aUtauData.SectionNoteAt(i);
  5. if ( aNote->GetValue(KEY_NAME_INTENSITY, &aIntensity) == B_OK ) {
  6. if ( aNote->SetValue(KEY_NAME_INTENSITY, aIntensity/2) != B_OK ) {
  7. echo("インデックス "+num_to_string(i)+" の音の強さを設定できませんでした。");
  8. }
  9. } else {
  10. echo("インデックス "+num_to_string(i)+" の音の強さが設定されていません。");
  11. }
  12. }
  13. echo("音の強さを半分にしました。");
  14.  

 これまで値の取得について見てきましたが、今度は、値の設定について解説します。UTAU で選択されている音符の音の強さを、すべて現在の半分に設定してみます。

 3~12 行目のループの回し方は、全ての音符の歌詞を取得した時と同じやり方です。

 5 行目で、音符の音の強さ(KEY_NAME_INTENSITY)を取得し、int32 型の変数 aIntensity に格納しています。

 6 行目が音の強さを設定している箇所です。値の設定には SetValue() 関数を使います。GetValue() 関数と使い方はほとんど同じで、第 1 引数がキー名です。音の強さを設定したいので KEY_NAME_INTENSITY を渡しています。第 2 引数が設定したい値で、現在の半分にしたいので、先ほど取得した aIntensity を 2 で割って渡しています。GetValue() と異なり、SetValue() では第 2 引数は値渡しです。

パイプファイルへの書き戻し


  1. // 変更内容をパイプファイルに書き戻す
  2. if ( aUtauData.Export(oArgV[1]) == B_OK ) {
  3. echo("パイプファイルに変更内容を保存しました。");
  4. } else {
  5. echo("パイプファイルに変更内容を保存できませんでした。");
  6. }
  7.  

 設定した値を UTAU 本体に返すには、パイプファイルを更新します。

 パイプファイルに変更点を書き出す関数は、TUtauData::Export() です(2 行目)。Export() 関数は、TUtauData の全てを書き出すのでは無く、SetValue() で更新されたプロパティのみ書き出します。

 以上で、サンプルプログラムの解説を終わります。

追記予定


  • 先行発声やオーバーラップも考慮し、さらに食い込み補正も計算に入れた実質の音符の長さを算出する TUtauSectionNote::GetCorrectedDuration()
  • 食い込み補正を計算に入れた値を取得する TUtauSectionNote::GetCorrectedPreUtterance()、GetCorrectedVoiceOverlap()
  • 「10,10,10,20,30,50,60,%,10,10,40」というエンベロープの表記を「(10, 20) (20, 30) (30, 40) (475, 50) (485, 60)」というように分かりやすく解釈する TUtauSectionNote::GetCorrectedEnvelope()
  • PBS、PBW、PBY に散らばっているピッチベンドをまとめる TUtauSectionNote::GetCorrectedPitch()
「解説」をウィキ内検索
LINE
シェア
Tweet
Lib UTAU ヘルプ
記事メニュー

ホーム


Home

サンプルプログラム

  • 解説
  • ビルド方法

Lib UTAU ご案内


  • ダウンロード
  • 同梱ファイル
  • 採用例
  • 今後の予定
  • コメント投稿

クラスリファレンス


  • 目次
  • TUtauData
  • TUtauSectionNote
  • TUtauSection
  • 定数






( - )




記事メニュー2

更新履歴


取得中です。

昨日のアクセス


  • カウンターの値があるページは1つもありません。
最近更新されたページ
  • 2385日前

    ダウンロード
  • 4193日前

    クラスリファレンス/TOtoIni
  • 4193日前

    クラスリファレンス
  • 4193日前

    採用例
  • 4193日前

    ビルド方法
  • 4193日前

    同梱ファイル
  • 4199日前

    ホーム
  • 4621日前

    クラスリファレンス/TUtauData
  • 5144日前

    クラスリファレンス/TUtauSectionNote
  • 5145日前

    MenuBar_Left
もっと見る
最近更新されたページ
  • 2385日前

    ダウンロード
  • 4193日前

    クラスリファレンス/TOtoIni
  • 4193日前

    クラスリファレンス
  • 4193日前

    採用例
  • 4193日前

    ビルド方法
  • 4193日前

    同梱ファイル
  • 4199日前

    ホーム
  • 4621日前

    クラスリファレンス/TUtauData
  • 5144日前

    クラスリファレンス/TUtauSectionNote
  • 5145日前

    MenuBar_Left
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. AviUtl2のWiki
  3. R.E.P.O. 日本語解説Wiki
  4. しかのつのまとめ
  5. シュガードール情報まとめウィキ
  6. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. ソードランページ @ 非公式wiki
  8. SYNDUALITY Echo of Ada 攻略 ウィキ
  9. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  10. ドラゴンボール Sparking! ZERO 攻略Wiki
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 発車メロディーwiki
  6. 検索してはいけない言葉 @ ウィキ
  7. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  8. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  9. オレカバトル アプリ版 @ ウィキ
  10. モンスター烈伝オレカバトル2@wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. 召喚 - PATAPON(パタポン) wiki
  3. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  4. ステージ - PATAPON(パタポン) wiki
  5. ロスサントス警察 - ストグラ まとめ @ウィキ
  6. LUPIN THE IIIRD THE MOVIE 不死身の血族 - アニヲタWiki(仮)
  7. アイテム - PATAPON(パタポン) wiki
  8. ステージ攻略 - パタポン2 ドンチャカ♪@うぃき
  9. モンスター一覧_第2章 - モンスター烈伝オレカバトル2@wiki
  10. 可愛い逃亡者(トムとジェリー) - アニヲタWiki(仮)
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.