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

1185 lines
36 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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__