2008年10月10日金曜日

blender - リップシンクツール製作でC#入門(2)



左上のmultilineテキストボックスをuserInput、右上のreadonlyテキストボックスをvowelという名前にしました。
userInputのKeyPressイベントで、改行が入力されると、vowelに母音が表示されるようにします。


折角C#なのでforeachというのを使ってみました。あと、文字の判別は正規表現を使ってみました。IsHiraganaってやつは、これ本当に使えるのか!?と思いますが、使えました。


private void userInput_KeyPress(object sender, KeyPressEventArgs e)
{
if (sender != this.userInput) return;

// Enterキーが押された
if (e.KeyChar == '\r')
{
// ひらがな以外の文字が無いチェック
if (!Regex.IsMatch(
this.userInput.Text, @"^\p{IsHiragana}*$", RegexOptions.Multiline))
{
MessageBox.Show("ひらがなのみで入力してください");
return;
}

// 入力を母音に変換
convertInputToVowel();
}
}

// 入力した歌詞を元に、母音のテキストボックスに母音を表示する
// 表示する文字は a i u e o n のどれか
private void convertInputToVowel()
{
// vowelテキストを消去
vowel.Text = "";

// 各行の母音をvowelテキストボックスに表示
string[] songLines = this.userInput.Text.Split('\n');
foreach(string line in songLines)
{
string vowelLine = "";

foreach (char c in line)
{
// 「っ」は無視
if (c == 'っ') continue;

string s = c.ToString();
// a
if (Regex.IsMatch(s,
"[あかさたなはまやらわ]|[がざだばぱ]"))
{
vowelLine += "a";
}
// i
if (Regex.IsMatch(s,
"[いきしちにひみり]|[ぎじぢびぴ]"))
{
vowelLine += "i";
}
// u
if (Regex.IsMatch(s,
"[うくすつぬふむゆる]|[ぐずづぶぷ]"))
{
vowelLine += "u";
}
// e
if (Regex.IsMatch(s,
"[えけせてねへめれ]|[げぜでべぺ]"))
{
vowelLine += "e";
}
// o
if (Regex.IsMatch(s,
"[おこそとのほもよろを]|[ごぞどぼぽ]"))
{
vowelLine += "o";
}
// 「にゃ」「にゅ」「にょ」などの特殊なケースは
// でかい文字のほうを消して、小さい文字の母音にする
if (Regex.IsMatch(s, "[ゃゅょ]"))
{
vowelLine
= vowelLine.Substring(0, vowelLine.Length - 1);
if (c == 'ゃ') { vowelLine += "a"; }
if (c == 'ゅ') { vowelLine += "u"; }
if (c == 'ょ') { vowelLine += "o"; }
}
// 「ん」は、母音の代わりに「n」を割り当てる
// (タイミング入力時に押さないのが難しいため)
if (c == 'ん')
{
vowelLine += "n";
}
}
this.vowel.Text += vowelLine + "\r\n";
}
}



続いて、ファイルを読み込んで音楽を再生します。
ツールボックスからMenuStripを追加して、それに、挿入-音声と追加しました。

音声メニューの名前をinsertMusicにし、ダブルクリックすると勝手にClickイベント入力画面になります。

そこに以下のように入力。

private void insertMusic_Click(object sender, EventArgs e)
{
this.openFileDialog1.ShowDialog();
this.axWindowsMediaPlayer1.settings.autoStart = false;
this.axWindowsMediaPlayer1.URL = this.openFileDialog1.FileName;
}



ファイルの読込みと再生が出来ました。

・・・ちょっとペースあげるか。

ドラッグアンドドロップでの入力にも対応

private void Form1_DragDrop(object sender, DragEventArgs e)
{
string[] s = (string[]) e.Data.GetData(DataFormats.FileDrop, false);
if (s.Length > 0)
{
this.axWindowsMediaPlayer1.URL = s[0];
}
}

private void Form1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.All;
else
e.Effect = DragDropEffects.None;
}

0 件のコメント: