Nanashi-softプログラマ専用UTAUプラグインを作ろう


◇UTAUプラグインを作ってみよう(5

UTAUから出力されたテンポラリを読み込む
ん〜なんかC++に簡単読み込みクラスみたいのないかな?
あったifstreamクラスとgetlineの組み合わせで簡単に行単位で読み込める
//○UTAUテンポラリファイルを読み込み
ifstream in_file2(utautempfile.c_str());
while(getline(in_file2, s)){
  vdata.push_back(s);
}

なんでifstreamの引数にstringが使えないのかと小一時間
char型配列にどうやって戻すのかわからなかったじゃないか
(私はC++ほとんど初めてです)

vector型の定義をパラパラーッとみる
なるほど,そう使うのね
(これでわからないような使い方は今後でてきません)
(私は勉強がとても嫌いです)

int utaunana::getutautempfile(void){
  //UTAUテンポラリファイルを読み込んで、利用できるように処理する
  string s;
  char c;

  //○UTAUテンポラリファイルを読み込み
  ifstream in_file2(utautempfile.c_str());
  while(getline(in_file2, s)){
    vdata.push_back(s);
  }

  //○セッション別に分ける
  //但しパラメータが全て来ているとは限らない
  int i;
  struct utauformat uf1;
  for(i=0; i < vdata.size(); i++){
    if(vdata[i].substr(0, 2) == "[#"){
      //セッションの切り替え
      if(vdata[i] != "[#SETTING]"){ //一番最初は保存しない
        //前回のセッションを保存する
        vdatas.push_back(uf1);
      }

      //初期化
      uf1.headername= "";
      uf1.Length= 0;
      uf1.Lyric= "";
      uf1.NoteNum= 0;
      uf1.PreUtterance= 0;
      uf1.VoiceOverlap= 0;
      uf1.Intensity= 0;
      uf1.Moduration= 0;
      uf1.PBType= 0;
      uf1.Piches.clear();
      uf1.Flags= "";
      uf1.Tempo= 0;
      uf1.Envelope= "";

      uf1.headername= vdata[i];
    } else if(vdata[i].substr(0, 6) == "Lyric="){
      uf1.Lyric= vdata[i].substr(6, vdata[i].size() - 6);
    } else{
      //非対応パラメータ
    }
  }
  //最後のセッションを保存する
  vdatas.push_back(uf1);

  return 0;
}

とりあえず歌詞のパラメータだけ読み込むようにしてみた
これでちゃんと動けば,あとはif文を追加して,他のパラメータにも対応するだけ
こういう単純なロジックな方が,もしUTAU本体の仕様に変更があってもすぐに追従できるから良いのだ

プログラマはプログラムを記述する人じゃない
最適なロジックを組める人の事を言うんだ
(……と,どの言語も変数定義すら何も見ないで書けない人が言ってみる)



TOPプログラマ専用UTAUプラグインを作ろう