using System; using System.Collections.Generic; using System.IO; using System.Windows.Forms; using System.Text.RegularExpressions; using org.kbinani.vsq; using org.kbinani; using org.kbinani.java.util; using org.kbinani.apputil; using org.kbinani.cadencii; //USTファイルを出力するプラグインMakeUST Ver1.1 //反映される情報 // 音符の長さ // 音符の高さ // 歌詞 // ピッチ(PITとPBS) // 音量(DYN) // テンポ // 先行発声 // オーバーラップ // エンベロープ // モジュレーション // フラグ //反映されない情報 // 歌手 // その他USTには無い情報 public class MakeUST { public static ScriptReturnStatus Edit( VsqFile Vsq ) { //選択されているトラック番号 int trackno = AppManager.getSelected(); if (trackno <= 0 ){ MessageBox.Show("現在のトラックが取得できません。"); return ScriptReturnStatus.NOT_EDITED; } VsqTrack track=Vsq.Track[trackno]; //コントロールカーブを取得 VsqBPList dyn=track.getCurve("dyn"); VsqBPList pit=track.getCurve("pit"); VsqBPList pbs=track.getCurve("pbs"); //ファイル選択 SaveFileDialog sfd=new SaveFileDialog(); sfd.Title = "USTファイルを出力"; sfd.FileName = string.Empty; sfd.CheckFileExists = false; sfd.AddExtension = true; sfd.OverwritePrompt = true; sfd.Filter ="USTファイル(*.ust)|*.ust|全てのファイル(*.*)|*.*"; sfd.FilterIndex = 1; DialogResult ret = sfd.ShowDialog(); if (ret != DialogResult.OK)return ScriptReturnStatus.NOT_EDITED; string fn=Path.GetFileNameWithoutExtension(sfd.FileName); //USTへの書き込み int counter=0,zenkaiclock=0; int count = track.getEventCount(); ret=MessageBox.Show("プリメジャーも出力しますか?","確認",MessageBoxButtons.YesNo); if(ret!=DialogResult.Yes)zenkaiclock=Vsq.getPreMeasureClocks(); double maetempo=GetTempoAverage(Vsq,zenkaiclock,0); System.IO.StreamWriter writer = null; writer = new System.IO.StreamWriter(sfd.FileName, false, System.Text.Encoding.Default ); writer.WriteLine("[#SETTING]"); writer.WriteLine("Tempo="+maetempo.ToString("0.00")); writer.WriteLine("Tracks=1"); writer.WriteLine("ProjectName="+fn); writer.WriteLine("VoiceDir=%VOICE%uta"); writer.WriteLine("OutFile="+fn+".wav"); writer.WriteLine("CacheDir="+fn+".cache"); writer.WriteLine("Tool1=wavtool.exe"); writer.WriteLine("Tool2=resampler.exe"); double tempoatai; string pitch; Regex regex = new Regex("^(0,)*0$"); for(int i=0;izenkaiclock) { writer.WriteLine("[#"+counter.ToString("0000")+"]"); writer.WriteLine("Length="+Convert.ToString(item.Clock-zenkaiclock)); writer.WriteLine("Lyric=R"); writer.WriteLine("NoteNum=60"); tempoatai=GetTempoAverage(Vsq,zenkaiclock,item.Clock-zenkaiclock); if(tempoatai!=maetempo) { writer.WriteLine("Tempo="+tempoatai.ToString("0.00")); maetempo=tempoatai; } counter++; } writer.WriteLine("[#"+counter.ToString("0000")+"]"); writer.WriteLine("Length="+item.ID.Length.ToString()); writer.WriteLine("Lyric="+item.ID.LyricHandle.L0.Phrase); writer.WriteLine("NoteNum="+item.ID.Note.ToString()); if(item.UstEvent!=null) { writer.WriteLine("PreUtterance="+ item.UstEvent.PreUtterance.ToString()); writer.WriteLine("VoiceOverlap="+ item.UstEvent.VoiceOverlap.ToString()); } writer.WriteLine("Intensity="+ Convert.ToString((int)(dyn.getValue(item.Clock)*100/64))); writer.WriteLine("Moduration="+item.UstEvent.Moduration.ToString()); pitch=""; int ii; for(ii=item.Clock;ii tempo=vsq.TempoTable; for(;tempokensaku