/* * SingerConfig.cs * Copyright (c) 2008-2009 kbinani * * This file is part of Boare.Lib.Vsq. * * Boare.Lib.Vsq is free software; you can redistribute it and/or * modify it under the terms of the BSD License. * * Boare.Lib.Vsq is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #if JAVA package org.kbinani.vsq; import java.io.*; import java.util.*; import org.kbinani.*; #else using System; using bocoree; using bocoree.java.util; using bocoree.java.io; namespace Boare.Lib.Vsq { #endif #if JAVA public class SingerConfig implements Cloneable { #else public class SingerConfig : ICloneable { #endif public String ID = ""; public String FORMAT = ""; public String VOICEIDSTR = ""; public String VOICENAME = "Unknown"; public int Breathiness; public int Brightness; public int Clearness; public int Opening; public int GenderFactor; public int Original; public int Program; public int Resonance1Amplitude; public int Resonance1Frequency; public int Resonance1BandWidth; public int Resonance2Amplitude; public int Resonance2Frequency; public int Resonance2BandWidth; public int Resonance3Amplitude; public int Resonance3Frequency; public int Resonance3BandWidth; public int Resonance4Amplitude; public int Resonance4Frequency; public int Resonance4BandWidth; public int Harmonics; public SingerConfig() { } public Object clone() { SingerConfig ret = new SingerConfig(); ret.ID = ID; ret.FORMAT = FORMAT; ret.VOICEIDSTR = VOICEIDSTR; ret.VOICENAME = VOICENAME; ret.Breathiness = Breathiness; ret.Brightness = Brightness; ret.Clearness = Clearness; ret.Opening = Opening; ret.GenderFactor = GenderFactor; ret.Original = Original; ret.Program = Program; ret.Resonance1Amplitude = Resonance1Amplitude; ret.Resonance1Frequency = Resonance1Frequency; ret.Resonance1BandWidth = Resonance1BandWidth; ret.Resonance2Amplitude = Resonance2Amplitude; ret.Resonance2Frequency = Resonance2Frequency; ret.Resonance2BandWidth = Resonance2BandWidth; ret.Resonance3Amplitude = Resonance3Amplitude; ret.Resonance3Frequency = Resonance3Frequency; ret.Resonance3BandWidth = Resonance3BandWidth; ret.Resonance4Amplitude = Resonance4Amplitude; ret.Resonance4Frequency = Resonance4Frequency; ret.Resonance4BandWidth = Resonance4BandWidth; ret.Harmonics = Harmonics; return ret; } #if !JAVA public object Clone() { return clone(); } #endif public static SingerConfig fromVvd( String file, int original ) { SingerConfig sc = new SingerConfig(); //original = original; sc.ID = "VOCALOID:VIRTUAL:VOICE"; sc.FORMAT = "2.0.0.0"; sc.VOICEIDSTR = ""; sc.VOICENAME = "Miku"; sc.Breathiness = 0; sc.Brightness = 0; sc.Clearness = 0; sc.Opening = 0; sc.GenderFactor = 0; sc.Original = original; //original = 0; RandomAccessFile fs = null; try { fs = new RandomAccessFile( file, "r" ); int length = (int)fs.length(); byte[] dat = new byte[length]; fs.read( dat, 0, length ); TransCodeUtil.decodeBytes( dat ); String str = PortUtil.getDecodedString( "Shift_JIS", dat ); #if DEBUG PortUtil.println( "SingerConfig.readSingerConfig; str=" + str ); #endif String crlf = "" + (char)0x0d + "" + (char)0x0a; String[] spl = PortUtil.splitString( str, new String[] { crlf }, true ); int count = spl.Length; for ( int i = 0; i < spl.Length; i++ ) { String s = spl[i]; int first = s.IndexOf( '"' ); int first_end = get_quated_string( s, first ); int second = s.IndexOf( '"', first_end + 1 ); int second_end = get_quated_string( s, second ); char[] chs = s.ToCharArray(); String id = new String( chs, first, first_end - first + 1 ); String value = new String( chs, second, second_end - second + 1 ); id = id.Substring( 1, PortUtil.getStringLength( id ) - 2 ); value = value.Substring( 1, PortUtil.getStringLength( value ) - 2 ); value = value.Replace( "\\" + "\"", "\"" ); int parsed_int = 64; try { parsed_int = PortUtil.parseInt( value ); } catch ( Exception ex ) { } if ( id.Equals( "ID" ) ) { sc.ID = value; } else if ( id.Equals( "FORMAT" ) ) { sc.FORMAT = value; } else if ( id.Equals( "VOICEIDSTR" ) ) { sc.VOICEIDSTR = value; } else if ( id.Equals( "VOICENAME" ) ) { sc.VOICENAME = value; } else if ( id.Equals( "Breathiness" ) || id.Equals( "Noise" ) ) { sc.Breathiness = parsed_int; } else if ( id.Equals( "Brightness" ) ) { sc.Brightness = parsed_int; } else if ( id.Equals( "Clearness" ) ) { sc.Clearness = parsed_int; } else if ( id.Equals( "Opening" ) ) { sc.Opening = parsed_int; } else if ( id.Equals( "Gender:Factor" ) ) { sc.GenderFactor = parsed_int; } else if ( id.Equals( "Resonance1:Frequency" ) ) { sc.Resonance1Frequency = parsed_int; } else if ( id.Equals( "Resonance1:Band:Width" ) ) { sc.Resonance1BandWidth = parsed_int; } else if ( id.Equals( "Resonance1:Amplitude" ) ) { sc.Resonance1Amplitude = parsed_int; } else if ( id.Equals( "Resonance2:Frequency" ) ) { sc.Resonance2Frequency = parsed_int; } else if ( id.Equals( "Resonance2:Band:Width" ) ) { sc.Resonance2BandWidth = parsed_int; } else if ( id.Equals( "Resonance2:Amplitude" ) ) { sc.Resonance2Amplitude = parsed_int; } else if ( id.Equals( "Resonance3:Frequency" ) ) { sc.Resonance3Frequency = parsed_int; } else if ( id.Equals( "Resonance3:Band:Width" ) ) { sc.Resonance3BandWidth = parsed_int; } else if ( id.Equals( "Resonance3:Amplitude" ) ) { sc.Resonance3Amplitude = parsed_int; } else if ( id.Equals( "Resonance4:Frequency" ) ) { sc.Resonance4Frequency = parsed_int; } else if ( id.Equals( "Resonance4:Band:Width" ) ) { sc.Resonance4BandWidth = parsed_int; } else if ( id.Equals( "Resonance4:Amplitude" ) ) { sc.Resonance4Amplitude = parsed_int; } else if ( id.Equals( "Harmonics" ) ) { sc.Harmonics = parsed_int; } } } catch ( Exception ex ) { } finally { if ( fs != null ) { try { fs.close(); } catch ( Exception ex2 ) { } } } return sc; } /// /// 位置positionにある'"'から,次に現れる'"'の位置を調べる.エスケープされた\"はスキップされる.'"'が見つからなかった場合-1を返す /// /// /// /// static int get_quated_string( String s, int position ) { if ( position < 0 ) { return -1; } char[] chs = s.ToCharArray(); if ( position >= chs.Length ) { return -1; } if ( chs[position] != '"' ) { return -1; } int end = -1; for ( int i = position + 1; i < chs.Length; i++ ) { if ( chs[i] == '"' && chs[i - 1] != '\\' ) { end = i; break; } } return end; } public String[] ToStringArray() { Vector ret = new Vector(); ret.add( "\"ID\":=:\"" + ID + "\"" ); ret.add( "\"FORMAT\":=:\"" + FORMAT + "\"" ); ret.add( "\"VOICEIDSTR\":=:\"" + VOICEIDSTR + "\"" ); ret.add( "\"VOICENAME\":=:\"" + VOICENAME.Replace( "\"", "\\\"" ) + "\"" ); ret.add( "\"Breathiness\":=:\"" + Breathiness + "\"" ); ret.add( "\"Brightness\":=:\"" + Brightness + "\"" ); ret.add( "\"Clearness\":=:\"" + Clearness + "\"" ); ret.add( "\"Opening\":=:\"" + Opening + "\"" ); ret.add( "\"Gender:Factor\":=:\"" + GenderFactor + "\"" ); return ret.toArray( new String[] { } ); } #if !JAVA public override string ToString() { return toString(); } #endif public String toString() { String[] r = ToStringArray(); String ret = ""; int count = r.Length; for ( int i = 0; i < count; i++ ) { String s = r[i]; ret += s + "\n"; } return ret; } } #if !JAVA } #endif