lipsync/trunk/Boare.Lib.Vsq/port_cpp/libvsq.h

1185 lines
36 KiB
C
Raw Normal View History

#ifndef __libvsq_h__
#define __libvsq_h__
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <stdlib.h>
#include "cp932.h"
using namespace std;
namespace vsq{
inline vector<string> util_split( string str, string delim ){
vector<string> result;
int cutAt;
while( (cutAt = str.find_first_of( delim )) != str.npos ){
if( cutAt > 0 ){
result.push_back( str.substr( 0, cutAt ) );
}
str = str.substr( cutAt + 1 );
}
if( str.length() > 0 ){
result.push_back( str );
}
return result;
}
inline string string_replace( string str, string before, string after ){
int start = 0;
int index = str.find( before, start );
string newone = str;
while( index < 0 ){
newone = newone.substr( 0, index ) + after + newone.substr( index + before.length() + 1 );
start = index + before.length() + 1 + (after.length() - before.length());
index = newone.find( before, start );
}
return newone;
}
template<class T> T parse( string s ){
ostringstream oss( "" );
T ret;
oss >> ret;
return ret;
}
typedef unsigned char byte;
struct TColor{
int R;
int G;
int B;
};
class StreamReader{
public:
StreamReader( string path ){
m_ifs.open( path.c_str() );
};
void Close(){
m_ifs.close();
};
string ReadLine(){
string ret;
if( get_line( &m_ifs, &ret ) ){
return ret;
}else{
return NULL;
}
};
int Peek(){
return m_ifs.peek();
};
private:
ifstream m_ifs;
static bool get_line( ifstream *ifs, string *str ){
char ch;
if( ifs->eof() ){
return false;
}
while( ifs->get( ch ) ){
if( ch == 0x0d ){
if( ifs->get( ch ) ){
if( ch != 0x0a ){
ifs->seekg( -1, ios::cur );
}
}
break;
}else if( ch == 0x0a ){
break;
}
str->append( 1, ch );
}
return true;
};
};
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[<5B><><EFBFBD>Ńe<C583>L<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߂̃N<CC83><4E><EFBFBD>X<EFBFBD>D
/// </summary>
class TextMemoryStream {
public:
/// <summary>
///
/// </summary>
/// <param name="s"></param>
void Write( string value ){
m_ms << value;
};
void Rewind(){
m_ms.seekg( 0, ios::beg );
};
void WriteLine( string s ){
m_ms << s << "\x0d\x0a";
};
void Close(){
m_ms.str( "" );
};
int Peek(){
long current = m_ms.tellg();
int ret = m_ms.get();
if( m_ms.gcount() <= 0 ){
m_ms.seekg( current, ios::beg );
return -1;
}
m_ms.seekg( current, ios::beg );
return ret;
};
string ReadLine(){
ostringstream buffer;
char value;
char ret;
ret = m_ms.get();
while ( ret >= 0 ) {
value = (char)ret;
if ( value == NEW_LINE[0] ) {
char next;
long current = m_ms.tellg(); //0x0D<30><44><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃X<CC83>g<EFBFBD><67><EFBFBD>[<5B><><EFBFBD>̈ʒu
for ( int i = 1; i < 2; i++ ) {
ret = m_ms.get();
if ( ret >= 0 ) {
next = ret;
if ( next != NEW_LINE[i] ) {
m_ms.seekg( current, ios::beg );
break;
}
}
}
break;
}
buffer << value;
ret = m_ms.get();
}
return buffer.str();
};
void Dispose(){
m_ms.str( "" );
};
TextMemoryStream( string path ){
m_ms.str( "" );
//if ( File.Exists( path ) ) {
StreamReader sr( path );
while( sr.Peek() >= 0 ){
string line = sr.ReadLine();
m_ms << line << "\x0d\x0a";
}
sr.Close();
m_ms.seekg( 0, ios::beg );
NEW_LINE[0] = '\x0d';
NEW_LINE[1] = '\x0a';
};
TextMemoryStream(){
m_ms.str( "" );
NEW_LINE[0] = '\x0d';
NEW_LINE[1] = '\x0a';
};
private:
//FileAccess m_access;
stringstream m_ms;
//Encoding m_enc;
char NEW_LINE[2];
};
class VsqCommon {
public:
string Version;
string Name;
string Color;
int DynamicsMode;
int PlayMode;
/// <summary>
/// <20>e<EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>[<5B>^<5E><><EFBFBD>w<EFBFBD><EFBFBD><E882B5><EFBFBD>R<EFBFBD><52><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>N<EFBFBD>^
/// </summary>
/// <param name="name"><3E>g<EFBFBD><67><EFBFBD>b<EFBFBD>N<EFBFBD><4E></param>
/// <param name="color">Color<6F>l<EFBFBD>i<EFBFBD>Ӗ<EFBFBD><D396>͕s<CD95><73><EFBFBD>j</param>
/// <param name="dynamics_mode">DynamicsMode<64>i<EFBFBD>f<EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD><67>1<EFBFBD>j</param>
/// <param name="play_mode">PlayMode<64>i<EFBFBD>f<EFBFBD>t<EFBFBD>H<EFBFBD><48><EFBFBD>g<EFBFBD><67>1<EFBFBD>j</param>
VsqCommon( string name, TColor color, int dynamics_mode, int play_mode );
/// <summary>
/// MetaText<78>̃e<CC83>L<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃R<CC83><52><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>N<EFBFBD>^
/// </summary>
/// <param name="sr"><3E>ǂݍ<C782><DD8D>ރe<DE83>L<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43></param>
/// <param name="last_line"><3E>ǂݍ<C782><DD8D>񂾍Ō<F182BE8D><C58C>̍s<CC8D><73><EFBFBD>Ԃ<EFBFBD><D482><EFBFBD><EFBFBD><EFBFBD></param>
VsqCommon( TextMemoryStream sr, string& last_line );
/// <summary>
/// <20>C<EFBFBD><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD>̓<EFBFBD><CC93>e<EFBFBD><65><EFBFBD>e<EFBFBD>L<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ɏo<C98F>͂<EFBFBD><CD82>܂<EFBFBD>
/// </summary>
/// <param name="sw"><3E>o<EFBFBD>͐<EFBFBD></param>
void write( TextMemoryStream& sw );
/// <summary>
/// VsqCommon<6F>\<5C><><EFBFBD>̂<EFBFBD><CC82>\<5C>z<EFBFBD><7A><EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>s<EFBFBD><73><EFBFBD>܂<EFBFBD>
/// </summary>
/// <returns><3E>e<EFBFBD>X<EFBFBD>g<EFBFBD>ɐ<EFBFBD><C990><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>true<75>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>łȂ<C582><C882><EFBFBD><EFBFBD><EFBFBD>false</returns>
static bool test();
};
enum VsqHandleType {
Lyric,
Vibrato,
Singer
};
const int _NUM_SYMBOL_VOWEL_JP = 5;
static string _SYMBOL_VOWEL_JP[_NUM_SYMBOL_VOWEL_JP] = {
"a",
"i",
"M",
"e",
"o",
};
const int _NUM_SYMBOL_CONSONANT_JP = 36;
static string _SYMBOL_CONSONANT_JP[_NUM_SYMBOL_CONSONANT_JP] = {
"k",
"k'",
"g",
"g'",
"N",
"N'",
"s",
"S",
"z",
"Z",
"dz",
"dZ",
"t",
"t'",
"ts",
"tS",
"d",
"d'",
"n",
"J",
"h",
"h\\",
"C",
"p\\",
"p\\'",
"b",
"b'",
"p",
"p'",
"m",
"m'",
"j",
"4",
"4'",
"w",
"N\\",
};
const int _NUM_SYMBOL_EN = 53;
static string _SYMBOL_EN[_NUM_SYMBOL_EN] = {
"@",
"V",
"e",
"e",
"I",
"i:",
"{",
"O:",
"Q",
"U",
"u:",
"@r",
"eI",
"aI",
"OI",
"@U",
"aU",
"I@",
"e@",
"U@",
"O@",
"Q@",
"w",
"j",
"b",
"d",
"g",
"bh",
"dh",
"gh",
"dZ",
"v",
"D",
"z",
"Z",
"m",
"n",
"N",
"r",
"l",
"l0",
"p",
"t",
"k",
"ph",
"th",
"kh",
"tS",
"f",
"T",
"s",
"S",
"h",
};
class VsqPhoneticSymbol {
public:
static bool IsConsonant( string symbol ) {
for( int i = 0; i < _NUM_SYMBOL_CONSONANT_JP; i++ ){
string s = _SYMBOL_CONSONANT_JP[i];
if ( s == symbol ) {
return true;
}
}
return false;
}
static bool IsValidSymbol( string symbol ) {
for( int i = 0; i < _NUM_SYMBOL_VOWEL_JP; i++ ){
string s = _SYMBOL_VOWEL_JP[i];
if ( s == symbol ) {
return true;
}
}
for( int i = 0; i < _NUM_SYMBOL_CONSONANT_JP; i++ ){
string s = _SYMBOL_CONSONANT_JP[i];
if ( s == symbol ) {
return true;
}
}
for( int i = 0; i < _NUM_SYMBOL_EN; i++ ){
string s = _SYMBOL_EN[i];
if ( s == symbol ) {
return true;
}
}
return false;
}
};
/// <summary>
/// VsqHandle<6C>Ɋi<C98A>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̎<EFBFBD><CC8E>̏<EFBFBD><CC8F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E><EFBFBD>X<EFBFBD>B
/// </summary>
class Lyric {
private:
string m_phrase;
vector<string> m_phonetic_symbol;
float d1;
vector<int> m_consonant_adjustment;
bool m_protected;
Lyric(){
}
/// <summary>
/// <20>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD>search<63>̒<EFBFBD><CC92>Ɋ܂܂<DC82><DC82><EFBFBD><EFBFBD>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD>value<75>̈ʒu<CA92><75><EFBFBD>T<EFBFBD><54><EFBFBD>܂<EFBFBD><DC82>B
/// </summary>
/// <param name="search"><3E><><EFBFBD><EFBFBD><EFBFBD>Ώۂ̃o<CC83>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD></param>
/// <param name="value"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD></param>
/// <returns>value<75><65><EFBFBD><EFBFBD><EFBFBD>‚<EFBFBD><C282><EFBFBD><EFBFBD>΂<EFBFBD><CE82>̃C<CC83><43><EFBFBD>f<EFBFBD>b<EFBFBD>N<EFBFBD>X<EFBFBD><58><EFBFBD>A<EFBFBD><41><EFBFBD>‚<EFBFBD><C282><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD><EFBFBD>-1<><31><EFBFBD>Ԃ<EFBFBD><D482>܂<EFBFBD></returns>
static int mIndexOf( vector<unsigned char> search, vector<unsigned char> value ) {
int i, j;
int search_length = search.size();
int value_length = value.size();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD>т<EFBFBD><D182>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>Ώۂ̃o<CC83>C<EFBFBD>g<EFBFBD><67><EFBFBD>т<EFBFBD><D182><EFBFBD><E892B7><EFBFBD>Ƃ<EFBFBD><C682>B
// <20><><EFBFBD>‚<EFBFBD><C282><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD>
if ( value_length > search_length ) {
return -1;
}
// i : <20><><EFBFBD><EFBFBD><EFBFBD>̊<EFBFBD><CC8A>_
for ( i = 0; i <= search_length - value_length; i++ ) {
bool failed = false;
for ( j = 0; j < value_length; j++ ) {
if ( search[i + j] != value[j] ) {
failed = true;
break;
}
}
if ( !failed ) {
return i;
}
}
return -1;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD>g<EFBFBD>o<EFBFBD>͉”\<5C><><EFBFBD>ǂ<EFBFBD><C782><EFBFBD><EFBFBD>𔻒肵<F094BB92>܂<EFBFBD>
/// </summary>
/// <param name="ch"></param>
/// <returns></returns>
static bool isprint( char ch ) {
if ( 32 <= (int)ch && (int)ch <= 126 ) {
return true;
} else {
return false;
}
}
public:
bool PhoneticSymbolProtected() {
return m_protected;
}
void PhoneticSymbolProtected( bool value ){
m_protected = value;
}
float UnknownFloat() {
return d1;
}
void UnknownFloat( float value ){
d1 = value;
}
vector<int> ConsonantAdjustment() {
return m_consonant_adjustment;
}
/// <summary>
/// <20>̎<EFBFBD><CC8E>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD>w<EFBFBD><EFBFBD><E882B5><EFBFBD>R<EFBFBD><52><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>N<EFBFBD>^
/// </summary>
/// <param name="phrase"><3E>̎<EFBFBD></param>
/// <param name="phonetic_symbol"><3E><><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><4C></param>
Lyric( string phrase, string phonetic_symbol ) {
m_phrase = phrase;
PhoneticSymbol( phonetic_symbol );
d1 = 0.000000f;
}
/// <summary>
/// <20><><EFBFBD>̉̎<CC89><CC8E>̃t<CC83><74><EFBFBD>[<5B>Y<EFBFBD><59><EFBFBD><EFBFBD>܂<EFBFBD><DC82>͐ݒ肵<DD92>܂<EFBFBD><DC82>B
/// </summary>
string Phrase() {
return m_phrase;
}
void Phrase( string value ){
m_phrase = value;
}
/// <summary>
/// <20><><EFBFBD>̉̎<CC89><CC8E>̔<EFBFBD><CC94><EFBFBD><EFBFBD>L<EFBFBD><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD><DC82>͐ݒ肵<DD92>܂<EFBFBD><DC82>B
/// </summary>
string PhoneticSymbol() {
string ret = m_phonetic_symbol[0];
for ( int i = 1; i < m_phonetic_symbol.size(); i++ ) {
ret += " " + m_phonetic_symbol[i];
}
return ret;
}
void PhoneticSymbol( string value ){
string s = string_replace( value, " ", " " );
m_phonetic_symbol = util_split( s, " " );
for ( int i = 0; i < m_phonetic_symbol.size(); i++ ) {
m_phonetic_symbol[i] = string_replace( m_phonetic_symbol[i], "\\\\", "\\" );
}
m_consonant_adjustment = vector<int>( m_phonetic_symbol.size() );
for ( int i = 0; i < m_phonetic_symbol.size(); i++ ) {
if ( VsqPhoneticSymbol::IsConsonant( m_phonetic_symbol[i] ) ) {
m_consonant_adjustment[i] = 64;
} else {
m_consonant_adjustment[i] = 0;
}
}
}
vector<string> PhoneticSymbolList(){
vector<string> ret = vector<string>( m_phonetic_symbol.size() );
for ( int i = 0; i < m_phonetic_symbol.size(); i++ ) {
ret[i] = m_phonetic_symbol[i];
}
return ret;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>񂩂<EFBFBD><F182A982>̃R<CC83><52><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>N<EFBFBD>^
/// </summary>
/// <param name="_line"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD></param>
Lyric( string _line ) {
if ( _line.length() <= 0 ) {
m_phrase = "a";
PhoneticSymbol( "a" );
d1 = 1.0f;
m_protected = false;
} else {
vector<string> spl = util_split( _line, "," );
int c_length = spl.size() - 3;
if ( spl.size() < 4 ) {
m_phrase = "a";
PhoneticSymbol( "a" );
d1 = 0.0f;
m_protected = false;
} else {
m_phrase = decode( spl[0] );
PhoneticSymbol( decode( spl[1] ) );
d1 = parse<float>( spl[2] );
m_protected = (spl[spl.size() - 1] == "0") ? false : true;
}
}
}
/// <summary>
/// mIndexOf<4F>̃e<CC83>X<EFBFBD>g<EFBFBD><67><EFBFBD>\<5C>b<EFBFBD>h<EFBFBD>Bsearch, value<75><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EB82A2><EFBFBD>ς<EFBFBD><CF82>ăe<C483>X<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD>B
/// </summary>
/// <returns></returns>
static bool test_mIndexOf() {
vector<unsigned char> search;
vector<unsigned char> value;
unsigned char src_search[6] = { 0, 12, 3, 5, 16, 34 };
unsigned char src_value[2] = { 16, 34 };
for( int i = 0; i < 6; i++ ){
search.push_back( src_search[i] );
}
for( int i = 0; i < 2; i++ ){
value.push_back( src_value[i] );
}
if ( mIndexOf( search, value ) == 4 ) {
return true;
} else {
return false;
}
}
/// <summary>
/// <20>G<EFBFBD>X<EFBFBD>P<EFBFBD>[<5B>v<EFBFBD><76><EFBFBD>ꂽ\"<22><><EFBFBD>A\x**<2A>𕜋A<F0959C8B><41><EFBFBD><EFBFBD><EFBFBD>܂<EFBFBD>
/// </summary>
/// <param name="_string"><3E>f<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD>Ώۂ̕<DB82><CC95><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E>f<EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD></returns>
static string decode( string _string ) {
string result = _string;
result = string_replace( result, "\\\"", "" );
vector<unsigned char> str;
for( int i = 0; i < result.length(); i++ ){
str.push_back( (unsigned char)result[i] );
}
vector<unsigned char> x16;
string xx = "\\x";
for( int i = 0; i < xx.length(); i++ ){
x16.push_back( (unsigned char)xx[i] );
}
int index = mIndexOf( str, x16 );
while ( index >= 0 ) {
char chr_byte[2];
chr_byte[0] = str[index + 2];
chr_byte[1] = str[index + 3];
string chr( chr_byte );
char *endstr;
int chrcode = strtol( chr.c_str(), &endstr, 16 );
str[index] = (byte)chrcode;
for ( int i = index + 4; i < str.size(); i++ ) {
str[i - 3] = str[i];
}
int length = str.size() - 3;
vector<byte> new_str;
for ( int i = 0; i < length; i++ ) {
new_str.push_back( str[i] );
}
Array.Resize( ref str, length );
str = new_str;
index = mIndexOf( str, x16 );
}
return cp932_convert( str );
}
/// <summary>
/// <20>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EA82BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̒<EFBFBD><CC92><EFBFBD>2<EFBFBD>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\x**<2A>̌`<60><><EFBFBD>ɃG<C983><47><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>܂<EFBFBD><DC82>B
/// </summary>
/// <param name="item"><3E>G<EFBFBD><47><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD>Ώ<EFBFBD></param>
/// <returns><3E>G<EFBFBD><47><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
static vector<wchar_t> encode( string item ) {
//Encoding sjis = Encoding.GetEncoding( 932 );
unsigned char[] bytea = cp932_convert( item );// sjis.GetBytes( item );
string result = "";
for ( int i = 0; i < bytea.Length; i++ ) {
if ( isprint( (char)bytea[i] ) ) {
result += (char)bytea[i];
} else {
result += "\\x" + Convert.ToString( bytea[i], 16 );
}
}
wchar_t[] res = result.ToCharArray();
return res;
}
/// <summary>
/// <20>^<5E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EA82BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Shift_JIS<49>Ƃ݂Ȃ<DD82><C882>Abyte[]<5D>ɕϊ<C995><CF8A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>char[]<5D>ɕϊ<C995><CF8A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̕Ԃ<CC95><D482>܂<EFBFBD>
/// </summary>
/// <param name="item"><3E>ϊ<EFBFBD><CF8A><EFBFBD><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E>ϊ<EFBFBD><CF8A><EFBFBD><EFBFBD><EFBFBD>char[]</returns>
static vector<wchar_t> encodeEx( string item ) {
//Encoding sjis = Encoding.GetEncoding( 932 );
byte[] dat = cp932_convert( item );// sjis.GetBytes( item );
char[] result = new char[dat.Length];
for ( int i = 0; i < dat.Length; i++ ) {
result[i] = (char)dat[i];
}
return result;
}
/// <summary>
/// <20><><EFBFBD>̃C<CC83><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD>𕶎<EFBFBD><F095B68E><EFBFBD><EFBFBD>ɕϊ<C995><CF8A><EFBFBD><EFBFBD>܂<EFBFBD>
/// </summary>
/// <param name="a_encode">2<>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>G<EFBFBD><47><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD>ۂ<EFBFBD><DB82><EFBFBD><EFBFBD>w<EFBFBD><EFBFBD><E882B7><EFBFBD>t<EFBFBD><74><EFBFBD>O</param>
/// <returns><3E>ϊ<EFBFBD><CF8A><EFBFBD><EFBFBD>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD></returns>
string ToString( bool a_encode ) {
string result;
if ( a_encode ) {
string njp = new string( encode( this.Phrase ) );
result = "\"" + njp + "\",\"" + this.PhoneticSymbol + "\"," + d1.ToString( "0.000000" );
} else {
result = "\"";
//Encoding sjis = Encoding.GetEncoding( 932 );
byte[] dat = cp932.convert( this.Phrase );// sjis.GetBytes( this.Phrase );
for ( int i = 0; i < dat.Length; i++ ) {
result += (char)dat[i];
}
result += "\",\"" + this.PhoneticSymbol + "\"," + d1.ToString( "0.000000" );
result = result.Replace( "\\\\", "\\" );
}
for ( int i = 0; i < m_consonant_adjustment.Length; i++ ) {
result += "," + m_consonant_adjustment[i];
}
if ( m_protected ) {
result += ",1";
} else {
result += ",0";
}
return result;
}
/// <summary>
/// Lyric<69>C<EFBFBD><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD><58><EFBFBD>\<5C>z<EFBFBD><7A><EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>s<EFBFBD><73><EFBFBD>܂<EFBFBD>
/// </summary>
/// <returns><3E>e<EFBFBD>X<EFBFBD>g<EFBFBD>ɐ<EFBFBD><C990><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>true<75>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>łȂ<C582><C882><EFBFBD><EFBFBD><EFBFBD>false<73><65><EFBFBD>Ԃ<EFBFBD><D482>܂<EFBFBD></returns>
static bool test() {
string line = "\\\"\\x82\\xe7\\\",\\\"4 a\\\",1.000000,64,1,1";
//Console.WriteLine( "Lyric.test; line=" + line );
Lyric lyric( line );
if ( lyric.Phrase == "<EFBFBD><EFBFBD>" &&
lyric.PhoneticSymbol == "4 a" &&
lyric.d1 == 1.0 &&
lyric.m_consonant_adjustment[0] == 64 &&
lyric.m_consonant_adjustment[1] == 1 &&
lyric.m_consonant_adjustment[2] == 1 ) {
return true;
} else {
return false;
}
}
};
/// <summary>
/// <20>n<EFBFBD><6E><EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E888B5><EFBFBD>܂<EFBFBD><DC82>B<EFBFBD>n<EFBFBD><6E><EFBFBD>h<EFBFBD><68><EFBFBD>ɂ<EFBFBD>LyricHandle<6C>AVibratoHandle<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IconHandle<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
class VsqHandle {
private:
VsqHandleType m_type;
/// <summary>
/// <20>C<EFBFBD><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD><58><EFBFBD>R<EFBFBD><52><EFBFBD>\<5C>[<5B><><EFBFBD><EFBFBD><EFBFBD>ʂɏo<C98F>͂<EFBFBD><CD82>܂<EFBFBD>
/// </summary>
void Print() {
string result = this.ToString();
Console.WriteLine( result );
}
public:
int Index;
string IconID;
string IDS;
Lyric L0;
int Original;
string Caption;
int Length;
int StartDepth;
VibratoBPList DepthBP;
int StartRate;
VibratoBPList RateBP;
protected:
int m_language;
int m_program;
protected VsqHandle() {
}
public:
LyricHandle ConvertToLyricHandle() {
LyricHandle ret = new LyricHandle();
ret.L0 = (Lyric)L0;
ret.m_type = m_type;
ret.Index = Index;
return ret;
}
VibratoHandle ConvertToVibratoHandle() {
VibratoHandle ret = new VibratoHandle();
ret.m_type = m_type;
ret.Index = Index;
ret.Caption = Caption;
ret.DepthBP = (VibratoBPList)DepthBP.Clone();
ret.IconID = IconID;
ret.IDS = IDS;
ret.Index = Index;
ret.Length = Length;
ret.Original = Original;
ret.RateBP = (VibratoBPList)RateBP.Clone();
ret.StartDepth = StartDepth;
ret.StartRate = StartRate;
return ret;
}
IconHandle ConvertToIconHandle() {
IconHandle ret = new IconHandle();
ret.m_type = m_type;
ret.Index = Index;
ret.Caption = Caption;
ret.IconID = IconID;
ret.IDS = IDS;
ret.Index = Index;
ret.Language( m_language );
ret.Length = Length;
ret.Original = Original;
ret.Program( m_program );
return ret;
}
VsqHandleType type() {
return m_type;
}
void type( VsqHandleType value ) {
m_type = value;
}
/// <summary>
/// <20>C<EFBFBD><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD><58><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>[<5B><><EFBFBD>ɏ<EFBFBD><C98F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>݂܂<DD82><DC82>B
/// encode=true<75>̏ꍇ<CC8F>A2<41>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>G<EFBFBD><47><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD>ďo<C48F>͂<EFBFBD><CD82>܂<EFBFBD><DC82>B
/// </summary>
/// <param name="sw"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݑΏ<DD91></param>
/// <param name="encode">2<>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>G<EFBFBD><47><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD>ۂ<EFBFBD><DB82><EFBFBD><EFBFBD>w<EFBFBD><EFBFBD><E882B7><EFBFBD>t<EFBFBD><74><EFBFBD>O</param>
void write( TextMemoryStream sw, bool encode ) {
sw.WriteLine( this.ToString( encode ) );
}
/// <summary>
/// FileStream<61><6D><EFBFBD><EFBFBD><EFBFBD>ǂݍ<C782><DD8D>݂Ȃ<DD82><C882><EFBFBD><EFBFBD>R<EFBFBD><52><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>N<EFBFBD>g
/// </summary>
/// <param name="sr"><3E>ǂݍ<C782><DD8D>ݑΏ<DD91></param>
VsqHandle( TextMemoryStream sr, int value, ref string last_line ) {
this.Index = value;
string[] spl;
string[] spl2;
// default<6C>l<EFBFBD>Ŕ~
this.type( VsqHandleType.Vibrato );
IconID = "";
IDS = "normal";
L0 = new Lyric( "" );
Original = 0;
Caption = "";
Length = 0;
StartDepth = 0;
DepthBP = null;
int depth_bp_num = 0;
StartRate = 0;
RateBP = null;
int rate_bp_num = 0;
m_language = 0;
m_program = 0;
string tmpDepthBPX = "";
string tmpDepthBPY = "";
string tmpRateBPX = "";
string tmpRateBPY = "";
// "["<22>ɂԂ<C982><D482><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>܂œǍ<C593><C78D><EFBFBD>
last_line = sr.ReadLine();
while ( !last_line.StartsWith( "[" ) ) {
spl = last_line.Split( new char[] { '=' } );
switch ( spl[0] ) {
case "Language":
m_language = int.Parse( spl[1] );
break;
case "Program":
m_program = int.Parse( spl[1] );
break;
case "IconID":
IconID = spl[1];
break;
case "IDS":
IDS = spl[1];
break;
case "Original":
Original = int.Parse( spl[1] );
break;
case "Caption":
Caption = spl[1];
for ( int i = 2; i < spl.Length; i++ ) {
Caption += "=" + spl[i];
}
break;
case "Length":
Length = int.Parse( spl[1] );
break;
case "StartDepth":
StartDepth = int.Parse( spl[1] );
break;
case "DepthBPNum":
depth_bp_num = int.Parse( spl[1] );
break;
case "DepthBPX":
tmpDepthBPX = spl[1];
break;
case "DepthBPY":
tmpDepthBPY = spl[1];
break;
case "StartRate":
StartRate = int.Parse( spl[1] );
break;
case "RateBPNum":
rate_bp_num = int.Parse( spl[1] );
break;
case "RateBPX":
tmpRateBPX = spl[1];
break;
case "RateBPY":
tmpRateBPY = spl[1];
break;
case "L0":
m_type = VsqHandleType.Lyric;
L0 = new Lyric( spl[1] );
break;
}
if ( sr.Peek() < 0 ) {
break;
}
last_line = sr.ReadLine();
}
if ( IDS != "normal" ) {
type( VsqHandleType.Singer );
} else if ( IconID != "" ) {
type( VsqHandleType.Vibrato );
} else {
type( VsqHandleType.Lyric );
}
// RateBPX, RateBPY<50>̐ݒ<CC90>
if ( this.type() == VsqHandleType.Vibrato ) {
if ( rate_bp_num > 0 ) {
float[] rate_bp_x = new float[rate_bp_num];
spl2 = tmpRateBPX.Split( new char[] { ',' } );
for ( int i = 0; i < rate_bp_num; i++ ) {
rate_bp_x[i] = float.Parse( spl2[i] );
}
int[] rate_bp_y = new int[rate_bp_num];
spl2 = tmpRateBPY.Split( new char[] { ',' } );
for ( int i = 0; i < rate_bp_num; i++ ) {
rate_bp_y[i] = int.Parse( spl2[i] );
}
RateBP = new VibratoBPList( rate_bp_x, rate_bp_y );
} else {
//m_rate_bp_x = null;
//m_rate_bp_y = null;
RateBP = new VibratoBPList();
}
// DepthBPX, DepthBPY<50>̐ݒ<CC90>
if ( depth_bp_num > 0 ) {
float[] depth_bp_x = new float[depth_bp_num];
spl2 = tmpDepthBPX.Split( new char[] { ',' } );
for ( int i = 0; i < depth_bp_num; i++ ) {
depth_bp_x[i] = float.Parse( spl2[i] );
}
int[] depth_bp_y = new int[depth_bp_num];
spl2 = tmpDepthBPY.Split( new char[] { ',' } );
for ( int i = 0; i < depth_bp_num; i++ ) {
depth_bp_y[i] = int.Parse( spl2[i] );
}
DepthBP = new VibratoBPList( depth_bp_x, depth_bp_y );
} else {
DepthBP = new VibratoBPList();
//m_depth_bp_x = null;
//m_depth_bp_y = null;
}
} else {
DepthBP = new VibratoBPList();
RateBP = new VibratoBPList();
}
}
/// <summary>
/// <20>n<EFBFBD><6E><EFBFBD>h<EFBFBD><68><EFBFBD>w<EFBFBD><77><EFBFBD>q<EFBFBD>i<EFBFBD><EFBFBD><E182A6>"h#0123"<22>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD>n<EFBFBD><6E><EFBFBD>h<EFBFBD><68><EFBFBD>ԍ<EFBFBD><D48D><EFBFBD><EFBFBD><EFBFBD><E693BE><EFBFBD>܂<EFBFBD>
/// </summary>
/// <param name="_string"><3E>n<EFBFBD><6E><EFBFBD>h<EFBFBD><68><EFBFBD>w<EFBFBD><77><EFBFBD>q</param>
/// <returns><3E>n<EFBFBD><6E><EFBFBD>h<EFBFBD><68><EFBFBD>ԍ<EFBFBD></returns>
static int HandleIndexFromString( string _string ) {
string[] spl = _string.Split( new char[] { '#' } );
return int.Parse( spl[1] );
}
/// <summary>
/// <20>C<EFBFBD><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD><58><EFBFBD>e<EFBFBD>L<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ɏo<C98F>͂<EFBFBD><CD82>܂<EFBFBD>
/// </summary>
/// <param name="sw"><3E>o<EFBFBD>͐<EFBFBD></param>
void Print( StreamWriter sw ) {
string result = this.ToString();
sw.WriteLine( result );
}
/// <summary>
/// <20>C<EFBFBD><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD>𕶎<EFBFBD><F095B68E><EFBFBD><EFBFBD>ɕϊ<C995><CF8A><EFBFBD><EFBFBD>܂<EFBFBD>
/// </summary>
/// <param name="encode">2<>o<EFBFBD>C<EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>G<EFBFBD><47><EFBFBD>R<EFBFBD>[<5B>h<EFBFBD><68><EFBFBD><EFBFBD>ۂ<EFBFBD><DB82><EFBFBD><EFBFBD>w<EFBFBD><EFBFBD><E882B7><EFBFBD>t<EFBFBD><74><EFBFBD>O</param>
/// <returns><3E>C<EFBFBD><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD><58><EFBFBD>ϊ<EFBFBD><CF8A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
string ToString( bool encode ) {
string result = "";
result += "[h#" + Index.ToString( "0000" ) + "]";
switch ( type() ) {
case VsqHandleType.Lyric:
result += Environment.NewLine + "L0=" + L0.ToString( encode );
break;
case VsqHandleType.Vibrato:
result += Environment.NewLine + "IconID=" + IconID + Environment.NewLine;
result += "IDS=" + IDS + Environment.NewLine;
result += "Original=" + Original + Environment.NewLine;
result += "Caption=" + Caption + Environment.NewLine;
result += "Length=" + Length + Environment.NewLine;
result += "StartDepth=" + StartDepth + Environment.NewLine;
result += "DepthBPNum=" + DepthBP.Num() + Environment.NewLine;
if ( DepthBP.Num() > 0 ) {
result += "DepthBPX=" + DepthBP.getElement( 0 ).X.ToString( "0.000000" );
for ( int i = 1; i < DepthBP.Num(); i++ ) {
result += "," + DepthBP.getElement( i ).X.ToString( "0.000000" );
}
result += Environment.NewLine + "DepthBPY=" + DepthBP.getElement( 0 ).Y;
for ( int i = 1; i < DepthBP.Num(); i++ ) {
result += "," + DepthBP.getElement( i ).Y;
}
result += Environment.NewLine;
}
result += "StartRate=" + StartRate + Environment.NewLine;
result += "RateBPNum=" + RateBP.Num();
if ( RateBP.Num() > 0 ) {
result += Environment.NewLine + "RateBPX=" + RateBP.getElement( 0 ).X.ToString( "0.000000" );
for ( int i = 1; i < RateBP.Num(); i++ ) {
result += "," + RateBP.getElement( i ).X.ToString( "0.000000" );
}
result += Environment.NewLine + "RateBPY=" + RateBP.getElement( 0 ).Y;
for ( int i = 1; i < RateBP.Num(); i++ ) {
result += "," + RateBP.getElement( i ).Y;
}
}
break;
case VsqHandleType.Singer:
result += Environment.NewLine + "IconID=" + IconID + Environment.NewLine;
result += "IDS=" + IDS + Environment.NewLine;
result += "Original=" + Original + Environment.NewLine;
result += "Caption=" + Caption + Environment.NewLine;
result += "Length=" + Length + Environment.NewLine;
result += "Language=" + m_language + Environment.NewLine;
result += "Program=" + m_program;
break;
default:
break;
}
return result;
}
};
class VsqID {
public:
int value;
VsqIDType type;
int IconHandle_index;
IconHandle IconHandle;
int Length;
int Note;
int Dynamics;
int PMBendDepth;
int PMBendLength;
int PMbPortamentoUse;
int DEMdecGainRate;
int DEMaccent;
int LyricHandle_index;
LyricHandle LyricHandle;
int VibratoHandle_index;
VibratoHandle VibratoHandle;
int VibratoDelay;
static VsqID EOS( -1 );
/// <summary>
/// ID<49>̔ԍ<CC94><D48D>iID#****<2A><>****<2A>j<EFBFBD><6A><EFBFBD>w<EFBFBD><EFBFBD><E882B5><EFBFBD>R<EFBFBD><52><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>N<EFBFBD>^<5E>B
/// </summary>
/// <param name="a_value">ID<49>̔ԍ<CC94></param>
VsqID( int a_value ) {
value = a_value;
}
/// <summary>
/// <20>e<EFBFBD>L<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃R<CC83><52><EFBFBD>X<EFBFBD>g<EFBFBD><67><EFBFBD>N<EFBFBD>^
/// </summary>
/// <param name="sr"><3E>ǂݍ<C782><DD8D>ݑΏ<DD91></param>
/// <param name="value"></param>
/// <param name="last_line"><3E>ǂݍ<C782><DD8D>񂾍Ō<F182BE8D><C58C>̍s<CC8D><73><EFBFBD>Ԃ<EFBFBD><D482><EFBFBD><EFBFBD>܂<EFBFBD></param>
VsqID( TextMemoryStream sr, int value, string& last_line ) {
string[] spl;
this.value = value;
this.type = VsqIDType.Unknown;
this.IconHandle_index = -2;
this.LyricHandle_index = -1;
this.VibratoHandle_index = -1;
this.Length = 0;
this.Note = 0;
this.Dynamics = 0;
this.PMBendDepth = 0;
this.PMBendLength = 0;
this.PMbPortamentoUse = 0;
this.DEMdecGainRate = 0;
this.DEMaccent = 0;
//this.LyricHandle_index = -2;
//this.VibratoHandle_index = -2;
this.VibratoDelay = 0;
last_line = sr.ReadLine();
while ( !last_line.StartsWith( "[" ) ) {
spl = last_line.Split( new char[] { '=' } );
switch ( spl[0] ) {
case "Type":
if ( spl[1] == "Anote" ) {
type = VsqIDType.Anote;
} else if ( spl[1] == "Singer" ) {
type = VsqIDType.Singer;
} else {
type = VsqIDType.Unknown;
}
break;
case "Length":
this.Length = int.Parse( spl[1] );
break;
case "Note#":
this.Note = int.Parse( spl[1] );
break;
case "Dynamics":
this.Dynamics = int.Parse( spl[1] );
break;
case "PMBendDepth":
this.PMBendDepth = int.Parse( spl[1] );
break;
case "PMBendLength":
this.PMBendLength = int.Parse( spl[1] );
break;
case "DEMdecGainRate":
this.DEMdecGainRate = int.Parse( spl[1] );
break;
case "DEMaccent":
this.DEMaccent = int.Parse( spl[1] );
break;
case "LyricHandle":
this.LyricHandle_index = VsqHandle.HandleIndexFromString( spl[1] );
break;
case "IconHandle":
this.IconHandle_index = VsqHandle.HandleIndexFromString( spl[1] );
break;
case "VibratoHandle":
this.VibratoHandle_index = VsqHandle.HandleIndexFromString( spl[1] );
break;
case "VibratoDelay":
this.VibratoDelay = int.Parse( spl[1] );
break;
case "PMbPortamentoUse":
PMbPortamentoUse = int.Parse( spl[1] );
break;
}
if ( sr.Peek() < 0 ) {
break;
}
last_line = sr.ReadLine();
}
}
string ToString() {
string ret = "{Type=" + type;
switch ( type ) {
case VsqIDType.Anote:
ret += ", Length=" + Length;
ret += ", Note#=" + Note;
ret += ", Dynamics=" + Dynamics;
ret += ", PMBendDepth=" + PMBendDepth ;
ret += ", PMBendLength=" + PMBendLength ;
ret += ", PMbPortamentoUse=" + PMbPortamentoUse ;
ret += ", DEMdecGainRate=" + DEMdecGainRate ;
ret += ", DEMaccent=" + DEMaccent ;
if ( LyricHandle != null ) {
ret += ", LyricHandle=h#" + LyricHandle_index.ToString( "0000" ) ;
}
if ( VibratoHandle != null ) {
ret += ", VibratoHandle=h#" + VibratoHandle_index.ToString( "0000" );
ret += ", VibratoDelay=" + VibratoDelay ;
}
break;
case VsqIDType.Singer:
ret += ", IconHandle=h#" + IconHandle_index.ToString( "0000" );
break;
}
ret += "}";
return ret;
}
/// <summary>
/// <20>C<EFBFBD><43><EFBFBD>X<EFBFBD>^<5E><><EFBFBD>X<EFBFBD><58><EFBFBD>e<EFBFBD>L<EFBFBD>X<EFBFBD>g<EFBFBD>t<EFBFBD>@<40>C<EFBFBD><43><EFBFBD>ɏo<C98F>͂<EFBFBD><CD82>܂<EFBFBD>
/// </summary>
/// <param name="sw"><3E>o<EFBFBD>͐<EFBFBD></param>
void write( TextMemoryStream sw ) {
sw.WriteLine( "[ID#" + value.ToString( "0000" ) + "]" );
sw.WriteLine( "Type=" + type );
switch( type ){
case VsqIDType.Anote:
sw.WriteLine( "Length=" + Length );
sw.WriteLine( "Note#=" + Note );
sw.WriteLine( "Dynamics=" + Dynamics );
sw.WriteLine( "PMBendDepth=" + PMBendDepth );
sw.WriteLine( "PMBendLength=" + PMBendLength );
sw.WriteLine( "PMbPortamentoUse=" + PMbPortamentoUse );
sw.WriteLine( "DEMdecGainRate=" + DEMdecGainRate );
sw.WriteLine( "DEMaccent=" + DEMaccent );
if ( LyricHandle != null ) {
sw.WriteLine( "LyricHandle=h#" + LyricHandle_index.ToString( "0000" ) );
}
if ( VibratoHandle != null ) {
sw.WriteLine( "VibratoHandle=h#" + VibratoHandle_index.ToString( "0000" ) );
sw.WriteLine( "VibratoDelay=" + VibratoDelay );
}
break;
case VsqIDType.Singer:
sw.WriteLine( "IconHandle=h#" + IconHandle_index.ToString( "0000" ) );
break;
}
}
};
}
#endif // __libvsq_h__