/*
 * ExpressionConfigSys.cs
 * Copyright (c) 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.util.*;
import java.io.*;
import org.kbinani.*;
#else
using System;
using System.Text;
using bocoree;
using bocoree.java.util;
using bocoree.java.io;

namespace Boare.Lib.Vsq {
#endif

    public class ExpressionConfigSys {
#if JAVA
        private final int MAX_VIBRATO = 0x400;
#else
        private const int MAX_VIBRATO = 0x400;
#endif
        private Vector<VibratoConfig> m_vibrato_configs;
        private Vector<AttackConfig> m_attack_configs;

        private void printTo( String file ) {
            BufferedWriter sw = null;
            try {
                sw = new BufferedWriter( new FileWriter( file ) );
                int count = 0;
                for ( Iterator itr = m_vibrato_configs.iterator(); itr.hasNext(); ) {
                    count++;
                    VibratoConfig vconfig = (VibratoConfig)itr.next();
                    String name = "v" + count;
                    sw.write( "VibratoConfig " + name + " = new VibratoConfig();" );
                    sw.newLine();
                    sw.write( name + ".author = \"" + vconfig.author + "\";" );
                    sw.newLine();
                    sw.write( name + ".file = \"" + vconfig.file + "\";" );
                    sw.newLine();
                    sw.write( name + ".number = " + vconfig.number + ";" );
                    sw.newLine();
                    sw.write( name + ".vendor = \"" + vconfig.vendor + "\";" );
                    sw.newLine();
                    sw.write( name + ".contents.IconID = \"" + vconfig.contents.IconID + "\";" );
                    sw.newLine();
                    sw.write( name + ".contents.IDS = \"" + vconfig.contents.IDS + "\";" );
                    sw.newLine();
                    sw.write( name + ".contents.Original = " + vconfig.contents.Original + ";" );
                    sw.newLine();
                    sw.write( name + ".contents.Caption = \"" + vconfig.contents.Caption + "\";" );
                    sw.newLine();
                    sw.write( name + ".contents.Length = " + vconfig.contents.getLength() + ";" );
                    sw.newLine();
                    sw.write( name + ".contents.StartDepth = " + vconfig.contents.StartDepth + ";" );
                    sw.write( name + ".contents.DepthBP = new VibratoBPList( new float[]{ " );
                    for ( int i = 0; i < vconfig.contents.DepthBP.getCount(); i++ ) {
                        sw.write( ((i > 0) ? ", " : "") + vconfig.contents.DepthBP.getElement( i ).X + "f" );
                    }
                    sw.write( " }, new int[]{ " );
                    for ( int i = 0; i < vconfig.contents.DepthBP.getCount(); i++ ) {
                        sw.write( ((i > 0) ? ", " : "") + vconfig.contents.DepthBP.getElement( i ).Y );
                    }
                    sw.write( " } );" );
                    sw.newLine();
                    sw.write( name + ".contents.StartRate = " + vconfig.contents.StartRate + ";" );
                    sw.newLine();
                    sw.write( name + ".contents.RateBP = new VibratoBPList( new float[]{ " );
                    for ( int i = 0; i < vconfig.contents.RateBP.getCount(); i++ ) {
                        sw.write( ((i > 0) ? ", " : "") + vconfig.contents.RateBP.getElement( i ).X + "f" );
                    }
                    sw.write( " }, new int[]{ " );
                    for ( int i = 0; i < vconfig.contents.RateBP.getCount(); i++ ) {
                        sw.write( ((i > 0) ? ", " : "") + vconfig.contents.RateBP.getElement( i ).Y );
                    }
                    sw.write( " } );" );
                    sw.newLine();
                    sw.write( "ret.m_vibrato_configs.add( " + name + " );" );
                    sw.newLine();
                    sw.newLine();
                }
                count = 0;

                for ( Iterator itr = m_attack_configs.iterator(); itr.hasNext(); ) {
                    count++;
                    AttackConfig aconfig = (AttackConfig)itr.next();
                    String name = "a" + count;
                    sw.write( "AttackConfig " + name + " = new AttackConfig();" );
                    sw.newLine();
                    sw.write( name + ".author = \"" + aconfig.author + "\";" );
                    sw.newLine();
                    sw.write( name + ".file = \"" + aconfig.file + "\";" );
                    sw.newLine();
                    sw.write( name + ".number = " + aconfig.number + ";" );
                    sw.newLine();
                    sw.write( name + ".vendor = \"" + aconfig.vendor + "\";" );
                    sw.newLine();
                    sw.write( name + ".contents.IconID = \"" + aconfig.contents.IconID + "\";" );
                    sw.newLine();
                    sw.write( name + ".contents.IDS = \"" + aconfig.contents.IDS + "\";" );
                    sw.newLine();
                    sw.write( name + ".contents.Original = " + aconfig.contents.Original + ";" );
                    sw.newLine();
                    sw.write( name + ".contents.Caption = \"" + aconfig.contents.Caption + "\";" );
                    sw.newLine();
                    sw.write( name + ".contents.Length = " + aconfig.contents.getLength() + ";" );
                    sw.newLine();
                    sw.write( name + ".contents.Duration = " + aconfig.contents.Duration + ";" );
                    sw.newLine();
                    sw.write( name + ".contents.Depth = " + aconfig.contents.Depth + ";" );
                    sw.newLine();
                    sw.write( "ret.m_attack_configs.add( " + name + " );" );
                    sw.newLine();
                    sw.newLine();
                }
            } catch ( Exception ex ) {
            } finally {
                if ( sw != null ) {
                    try {
                        sw.close();
                    } catch ( Exception ex2 ) {
                    }
                }
            }
        }

        public static ExpressionConfigSys getVocaloid1Default() {
            ExpressionConfigSys ret = new ExpressionConfigSys();
            ret.m_vibrato_configs = new Vector<VibratoConfig>();
            ret.m_attack_configs = new Vector<AttackConfig>();
            VibratoConfig v1 = new VibratoConfig();
            v1.author = "Taro";
            v1.file = "normal.aic";
            v1.number = 1;
            v1.vendor = "YAMAHA";
            v1.contents.IconID = "$04040001";
            v1.contents.IDS = "normal";
            v1.contents.Original = 0;
            v1.contents.Caption = "Normal Vibrato";
            v1.contents.setLength( 480 );
            v1.contents.StartDepth = 64;
            v1.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v1.contents.StartRate = 64;
            v1.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v1 );

            VibratoConfig v2 = new VibratoConfig();
            v2.author = "Taro";
            v2.file = "subtle.aic";
            v2.number = 2;
            v2.vendor = "YAMAHA";
            v2.contents.IconID = "$04040002";
            v2.contents.IDS = "normal";
            v2.contents.Original = 0;
            v2.contents.Caption = "Subtle Vibrato";
            v2.contents.setLength( 480 );
            v2.contents.StartDepth = 32;
            v2.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v2.contents.StartRate = 56;
            v2.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v2 );

            VibratoConfig v3 = new VibratoConfig();
            v3.author = "Taro";
            v3.file = "slight.aic";
            v3.number = 3;
            v3.vendor = "YAMAHA";
            v3.contents.IconID = "$04040003";
            v3.contents.IDS = "slight";
            v3.contents.Original = 0;
            v3.contents.Caption = "Slight Vibrato";
            v3.contents.setLength( 480 );
            v3.contents.StartDepth = 32;
            v3.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v3.contents.StartRate = 64;
            v3.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v3 );

            VibratoConfig v4 = new VibratoConfig();
            v4.author = "Taro";
            v4.file = "deep.aic";
            v4.number = 4;
            v4.vendor = "YAMAHA";
            v4.contents.IconID = "$04040004";
            v4.contents.IDS = "deep";
            v4.contents.Original = 0;
            v4.contents.Caption = "Deep Vibrato";
            v4.contents.setLength( 480 );
            v4.contents.StartDepth = 64;
            v4.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v4.contents.StartRate = 64;
            v4.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v4 );

            VibratoConfig v5 = new VibratoConfig();
            v5.author = "Taro";
            v5.file = "verydeep.aic";
            v5.number = 5;
            v5.vendor = "YAMAHA";
            v5.contents.IconID = "$04040005";
            v5.contents.IDS = "extreme";
            v5.contents.Original = 0;
            v5.contents.Caption = "Very Deep Vibrato";
            v5.contents.setLength( 480 );
            v5.contents.StartDepth = 64;
            v5.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v5.contents.StartRate = 120;
            v5.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v5 );

            VibratoConfig v6 = new VibratoConfig();
            v6.author = "Taro";
            v6.file = "extreme.aic";
            v6.number = 6;
            v6.vendor = "YAMAHA";
            v6.contents.IconID = "$04040006";
            v6.contents.IDS = "extreme";
            v6.contents.Original = 0;
            v6.contents.Caption = "Extreme Vibrato (like Japanese Enka)";
            v6.contents.setLength( 480 );
            v6.contents.StartDepth = 64;
            v6.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v6.contents.StartRate = 64;
            v6.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v6 );

            AttackConfig a1 = new AttackConfig();
            a1.author = "Taro";
            a1.file = "na_tenuto.aic";
            a1.number = 1;
            a1.vendor = "YAMAHA";
            a1.contents.IconID = "$01010001";
            a1.contents.IDS = "tenuto";
            a1.contents.Original = 0;
            a1.contents.Caption = "Tenuto";
            a1.contents.setLength( 120 );
            a1.contents.Duration = 64;
            a1.contents.Depth = 64;
            ret.m_attack_configs.add( a1 );

            AttackConfig a2 = new AttackConfig();
            a2.author = "Taro";
            a2.file = "na_accent.aic";
            a2.number = 2;
            a2.vendor = "YAMAHA";
            a2.contents.IconID = "$01010002";
            a2.contents.IDS = "accent";
            a2.contents.Original = 0;
            a2.contents.Caption = "Accent";
            a2.contents.setLength( 120 );
            a2.contents.Duration = 64;
            a2.contents.Depth = 64;
            ret.m_attack_configs.add( a2 );

            AttackConfig a3 = new AttackConfig();
            a3.author = "Taro";
            a3.file = "na_extreme_accent.aic";
            a3.number = 3;
            a3.vendor = "YAMAHA";
            a3.contents.IconID = "$01010003";
            a3.contents.IDS = "accent_extreme";
            a3.contents.Original = 0;
            a3.contents.Caption = "Extreme Accent";
            a3.contents.setLength( 120 );
            a3.contents.Duration = 64;
            a3.contents.Depth = 64;
            ret.m_attack_configs.add( a3 );

            AttackConfig a4 = new AttackConfig();
            a4.author = "Taro";
            a4.file = "na_legato.aic";
            a4.number = 4;
            a4.vendor = "YAMAHA";
            a4.contents.IconID = "$01010004";
            a4.contents.IDS = "legato";
            a4.contents.Original = 0;
            a4.contents.Caption = "Legato";
            a4.contents.setLength( 120 );
            a4.contents.Duration = 64;
            a4.contents.Depth = 64;
            ret.m_attack_configs.add( a4 );

            AttackConfig a5 = new AttackConfig();
            a5.author = "Taro";
            a5.file = "na_fast_bendup.aic";
            a5.number = 5;
            a5.vendor = "YAMAHA";
            a5.contents.IconID = "$01010005";
            a5.contents.IDS = "bendup_fast";
            a5.contents.Original = 0;
            a5.contents.Caption = "Fast Bendu";
            a5.contents.setLength( 120 );
            a5.contents.Duration = 64;
            a5.contents.Depth = 64;
            ret.m_attack_configs.add( a5 );

            AttackConfig a6 = new AttackConfig();
            a6.author = "Taro";
            a6.file = "na_slow_bendup.aic";
            a6.number = 6;
            a6.vendor = "YAMAHA";
            a6.contents.IconID = "$01010006";
            a6.contents.IDS = "bendup_slow";
            a6.contents.Original = 0;
            a6.contents.Caption = "Slow Bendup";
            a6.contents.setLength( 120 );
            a6.contents.Duration = 64;
            a6.contents.Depth = 64;
            ret.m_attack_configs.add( a6 );

            AttackConfig a7 = new AttackConfig();
            a7.author = "Taro";
            a7.file = "na_trill_semi.aic";
            a7.number = 7;
            a7.vendor = "YAMAHA";
            a7.contents.IconID = "$01010007";
            a7.contents.IDS = "trill_semi";
            a7.contents.Original = 0;
            a7.contents.Caption = "Trill Semitone";
            a7.contents.setLength( 120 );
            a7.contents.Duration = 64;
            a7.contents.Depth = 64;
            ret.m_attack_configs.add( a7 );

            AttackConfig a8 = new AttackConfig();
            a8.author = "Taro";
            a8.file = "na_trill_whole.aic";
            a8.number = 8;
            a8.vendor = "YAMAHA";
            a8.contents.IconID = "$01010008";
            a8.contents.IDS = "trill_whole";
            a8.contents.Original = 0;
            a8.contents.Caption = "Trill Wholetone";
            a8.contents.setLength( 120 );
            a8.contents.Duration = 64;
            a8.contents.Depth = 64;
            ret.m_attack_configs.add( a8 );

            AttackConfig a9 = new AttackConfig();
            a9.author = "Taro";
            a9.file = "na_mordent_semi.aic";
            a9.number = 9;
            a9.vendor = "YAMAHA";
            a9.contents.IconID = "$01010009";
            a9.contents.IDS = "mordent_semi";
            a9.contents.Original = 0;
            a9.contents.Caption = "Mordent Semitone";
            a9.contents.setLength( 120 );
            a9.contents.Duration = 64;
            a9.contents.Depth = 64;
            ret.m_attack_configs.add( a9 );

            AttackConfig a10 = new AttackConfig();
            a10.author = "Taro";
            a10.file = "na_mordent_whole.aic";
            a10.number = 10;
            a10.vendor = "YAMAHA";
            a10.contents.IconID = "$0101000a";
            a10.contents.IDS = "mordent_whole";
            a10.contents.Original = 0;
            a10.contents.Caption = "Mordent Wholetone";
            a10.contents.setLength( 120 );
            a10.contents.Duration = 64;
            a10.contents.Depth = 64;
            ret.m_attack_configs.add( a10 );

            return ret;
        }

        public static ExpressionConfigSys getVocaloid2Default() {
            ExpressionConfigSys ret = new ExpressionConfigSys();
            ret.m_vibrato_configs = new Vector<VibratoConfig>();
            ret.m_attack_configs = new Vector<AttackConfig>();
            VibratoConfig v1 = new VibratoConfig();
            v1.author = "Standard";
            v1.file = "normal2_type1.aic";
            v1.number = 1;
            v1.vendor = "YAMAHA";
            v1.contents.IconID = "$04040001";
            v1.contents.IDS = "normal";
            v1.contents.Original = 0;
            v1.contents.Caption = "[Normal] Type 1";
            v1.contents.setLength( 480 );
            v1.contents.StartDepth = 64;
            v1.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v1.contents.StartRate = 50;
            v1.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v1 );

            VibratoConfig v2 = new VibratoConfig();
            v2.author = "Standard";
            v2.file = "normal2_type2.aic";
            v2.number = 2;
            v2.vendor = "YAMAHA";
            v2.contents.IconID = "$04040002";
            v2.contents.IDS = "normal";
            v2.contents.Original = 0;
            v2.contents.Caption = "[Normal] Type 2";
            v2.contents.setLength( 480 );
            v2.contents.StartDepth = 40;
            v2.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v2.contents.StartRate = 50;
            v2.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v2 );

            VibratoConfig v3 = new VibratoConfig();
            v3.author = "Standard";
            v3.file = "normal2_type3.aic";
            v3.number = 3;
            v3.vendor = "YAMAHA";
            v3.contents.IconID = "$04040003";
            v3.contents.IDS = "normal";
            v3.contents.Original = 0;
            v3.contents.Caption = "[Normal] Type 3";
            v3.contents.setLength( 480 );
            v3.contents.StartDepth = 127;
            v3.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v3.contents.StartRate = 50;
            v3.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v3 );

            VibratoConfig v4 = new VibratoConfig();
            v4.author = "Standard";
            v4.file = "normal2_type4.aic";
            v4.number = 4;
            v4.vendor = "YAMAHA";
            v4.contents.IconID = "$04040004";
            v4.contents.IDS = "normal";
            v4.contents.Original = 0;
            v4.contents.Caption = "[Normal] Type 4";
            v4.contents.setLength( 480 );
            v4.contents.StartDepth = 64;
            v4.contents.DepthBP = new VibratoBPList( new float[] { 0.6042f, 0.6125f, 0.6167f, 0.6208f, 0.625f, 0.6333f, 0.6375f, 0.6417f, 0.6458f, 0.6542f, 0.6583f, 0.6667f, 0.6708f, 0.675f, 0.6792f, 0.6833f, 0.6917f, 0.6958f, 0.7042f, 0.7083f, 0.7125f, 0.7167f, 0.7208f, 0.725f, 0.7292f, 0.7375f, 0.7458f, 0.75f, 0.7583f, 0.7625f, 0.7667f, 0.7708f, 0.775f, 0.7833f, 0.7917f, 0.7958f, 0.8f, 0.8042f, 0.8083f, 0.8125f, 0.8208f, 0.8292f, 0.8375f, 0.8417f, 0.8458f, 0.85f, 0.8542f, 0.8625f, 0.8667f, 0.875f, 0.8792f, 0.8833f, 0.8875f, 0.8917f, 0.8958f, 0.9f, 1f }, new int[] { 64, 63, 62, 61, 59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 34, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 } );
            v4.contents.StartRate = 50;
            v4.contents.RateBP = new VibratoBPList( new float[] { 0.6f, 0.6125f, 0.6167f, 0.6208f, 0.6292f, 0.6333f, 0.6375f, 0.6417f, 0.6542f, 0.6583f, 0.6625f, 0.6667f, 0.675f, 0.6833f, 0.6875f, 0.6917f, 0.7f, 0.7042f, 0.7083f, 0.7125f, 0.725f, 0.7292f, 0.7333f, 0.7375f, 0.7458f, 0.75f, 0.7583f, 0.7625f, 0.7708f, 0.775f, 0.7792f, 0.7833f, 0.7958f, 0.8f, 0.8042f, 0.8083f, 0.8167f, 0.8208f, 0.8292f, 0.8333f, 0.8417f, 0.8458f, 0.85f, 0.8542f, 0.8667f, 0.8708f, 0.875f, 0.8792f, 0.8875f, 0.8917f, 0.9f, 1f }, new int[] { 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 } );
            ret.m_vibrato_configs.add( v4 );

            VibratoConfig v5 = new VibratoConfig();
            v5.author = "Standard";
            v5.file = "extreme2_type1.aic";
            v5.number = 5;
            v5.vendor = "YAMAHA";
            v5.contents.IconID = "$04040005";
            v5.contents.IDS = "extreme";
            v5.contents.Original = 0;
            v5.contents.Caption = "[Extreme] Type 1";
            v5.contents.setLength( 480 );
            v5.contents.StartDepth = 64;
            v5.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v5.contents.StartRate = 64;
            v5.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v5 );

            VibratoConfig v6 = new VibratoConfig();
            v6.author = "Standard";
            v6.file = "extreme2_type2.aic";
            v6.number = 6;
            v6.vendor = "YAMAHA";
            v6.contents.IconID = "$04040006";
            v6.contents.IDS = "extreme";
            v6.contents.Original = 0;
            v6.contents.Caption = "[Extreme] Type 2";
            v6.contents.setLength( 480 );
            v6.contents.StartDepth = 32;
            v6.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v6.contents.StartRate = 32;
            v6.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v6 );

            VibratoConfig v7 = new VibratoConfig();
            v7.author = "Standard";
            v7.file = "extreme2_type3.aic";
            v7.number = 7;
            v7.vendor = "YAMAHA";
            v7.contents.IconID = "$04040007";
            v7.contents.IDS = "extreme";
            v7.contents.Original = 0;
            v7.contents.Caption = "[Extreme] Type 3";
            v7.contents.setLength( 480 );
            v7.contents.StartDepth = 100;
            v7.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v7.contents.StartRate = 50;
            v7.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v7 );

            VibratoConfig v8 = new VibratoConfig();
            v8.author = "Standard";
            v8.file = "extreme2_type4.aic";
            v8.number = 8;
            v8.vendor = "YAMAHA";
            v8.contents.IconID = "$04040008";
            v8.contents.IDS = "extreme";
            v8.contents.Original = 0;
            v8.contents.Caption = "[Extreme] Type 4";
            v8.contents.setLength( 480 );
            v8.contents.StartDepth = 64;
            v8.contents.DepthBP = new VibratoBPList( new float[] { 0.6042f, 0.6125f, 0.6167f, 0.6208f, 0.625f, 0.6333f, 0.6375f, 0.6417f, 0.6458f, 0.6542f, 0.6583f, 0.6667f, 0.6708f, 0.675f, 0.6792f, 0.6833f, 0.6917f, 0.6958f, 0.7042f, 0.7083f, 0.7125f, 0.7167f, 0.7208f, 0.725f, 0.7292f, 0.7375f, 0.7458f, 0.75f, 0.7583f, 0.7625f, 0.7667f, 0.7708f, 0.775f, 0.7833f, 0.7917f, 0.7958f, 0.8f, 0.8042f, 0.8083f, 0.8125f, 0.8208f, 0.8292f, 0.8375f, 0.8417f, 0.8458f, 0.85f, 0.8542f, 0.8625f, 0.8667f, 0.875f, 0.8792f, 0.8833f, 0.8875f, 0.8917f, 0.8958f, 0.9f, 1f }, new int[] { 64, 63, 62, 61, 59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 34, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 } );
            v8.contents.StartRate = 64;
            v8.contents.RateBP = new VibratoBPList( new float[] { 0.6042f, 0.6125f, 0.6167f, 0.6208f, 0.625f, 0.6333f, 0.6375f, 0.6417f, 0.6458f, 0.6542f, 0.6583f, 0.6667f, 0.6708f, 0.675f, 0.6792f, 0.6833f, 0.6917f, 0.6958f, 0.7042f, 0.7083f, 0.7125f, 0.7167f, 0.7208f, 0.725f, 0.7292f, 0.7375f, 0.7458f, 0.75f, 0.7583f, 0.7625f, 0.7667f, 0.7708f, 0.775f, 0.7833f, 0.7917f, 0.7958f, 0.8f, 0.8042f, 0.8083f, 0.8125f, 0.8208f, 0.8292f, 0.8375f, 0.8417f, 0.8458f, 0.85f, 0.8542f, 0.8625f, 0.8667f, 0.875f, 0.8792f, 0.8833f, 0.8875f, 0.8917f, 0.8958f, 0.9f, 1f }, new int[] { 64, 63, 62, 61, 59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 34, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 } );
            ret.m_vibrato_configs.add( v8 );

            VibratoConfig v9 = new VibratoConfig();
            v9.author = "Standard";
            v9.file = "fast2_type1.aic";
            v9.number = 9;
            v9.vendor = "YAMAHA";
            v9.contents.IconID = "$04040009";
            v9.contents.IDS = "fast";
            v9.contents.Original = 0;
            v9.contents.Caption = "[Fast] Type 1";
            v9.contents.setLength( 480 );
            v9.contents.StartDepth = 64;
            v9.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v9.contents.StartRate = 64;
            v9.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v9 );

            VibratoConfig v10 = new VibratoConfig();
            v10.author = "Standard";
            v10.file = "fast2_type2.aic";
            v10.number = 10;
            v10.vendor = "YAMAHA";
            v10.contents.IconID = "$0404000a";
            v10.contents.IDS = "fast";
            v10.contents.Original = 0;
            v10.contents.Caption = "[Fast] Type 2";
            v10.contents.setLength( 480 );
            v10.contents.StartDepth = 40;
            v10.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v10.contents.StartRate = 50;
            v10.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v10 );

            VibratoConfig v11 = new VibratoConfig();
            v11.author = "Standard";
            v11.file = "fast2_type3.aic";
            v11.number = 11;
            v11.vendor = "YAMAHA";
            v11.contents.IconID = "$0404000b";
            v11.contents.IDS = "fast";
            v11.contents.Original = 0;
            v11.contents.Caption = "[Fast] Type 3";
            v11.contents.setLength( 480 );
            v11.contents.StartDepth = 80;
            v11.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v11.contents.StartRate = 70;
            v11.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v11 );

            VibratoConfig v12 = new VibratoConfig();
            v12.author = "Standard";
            v12.file = "fast2_type4.aic";
            v12.number = 12;
            v12.vendor = "YAMAHA";
            v12.contents.IconID = "$0404000c";
            v12.contents.IDS = "fast";
            v12.contents.Original = 0;
            v12.contents.Caption = "[Fast] Type 4";
            v12.contents.setLength( 480 );
            v12.contents.StartDepth = 64;
            v12.contents.DepthBP = new VibratoBPList( new float[] { 0.6042f, 0.6125f, 0.6167f, 0.6208f, 0.625f, 0.6333f, 0.6375f, 0.6417f, 0.6458f, 0.6542f, 0.6583f, 0.6667f, 0.6708f, 0.675f, 0.6792f, 0.6833f, 0.6917f, 0.6958f, 0.7042f, 0.7083f, 0.7125f, 0.7167f, 0.7208f, 0.725f, 0.7292f, 0.7375f, 0.7458f, 0.75f, 0.7583f, 0.7625f, 0.7667f, 0.7708f, 0.775f, 0.7833f, 0.7917f, 0.7958f, 0.8f, 0.8042f, 0.8083f, 0.8125f, 0.8208f, 0.8292f, 0.8375f, 0.8417f, 0.8458f, 0.85f, 0.8542f, 0.8625f, 0.8667f, 0.875f, 0.8792f, 0.8833f, 0.8875f, 0.8917f, 0.8958f, 0.9f, 1f }, new int[] { 64, 63, 62, 61, 59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 34, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 } );
            v12.contents.StartRate = 64;
            v12.contents.RateBP = new VibratoBPList( new float[] { 0.6042f, 0.6125f, 0.6167f, 0.6208f, 0.625f, 0.6333f, 0.6375f, 0.6417f, 0.6458f, 0.6542f, 0.6583f, 0.6667f, 0.6708f, 0.675f, 0.6792f, 0.6833f, 0.6917f, 0.6958f, 0.7042f, 0.7083f, 0.7125f, 0.7167f, 0.7208f, 0.725f, 0.7292f, 0.7375f, 0.7458f, 0.75f, 0.7583f, 0.7625f, 0.7667f, 0.7708f, 0.775f, 0.7833f, 0.7917f, 0.7958f, 0.8f, 0.8042f, 0.8083f, 0.8125f, 0.8208f, 0.8292f, 0.8375f, 0.8417f, 0.8458f, 0.85f, 0.8542f, 0.8625f, 0.8667f, 0.875f, 0.8792f, 0.8833f, 0.8875f, 0.8917f, 0.8958f, 0.9f, 1f }, new int[] { 64, 63, 62, 61, 59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 34, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 } );
            ret.m_vibrato_configs.add( v12 );

            VibratoConfig v13 = new VibratoConfig();
            v13.author = "Standard";
            v13.file = "slight2_type1.aic";
            v13.number = 13;
            v13.vendor = "YAMAHA";
            v13.contents.IconID = "$0404000d";
            v13.contents.IDS = "slight";
            v13.contents.Original = 0;
            v13.contents.Caption = "[Slight] Type 1";
            v13.contents.setLength( 480 );
            v13.contents.StartDepth = 64;
            v13.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v13.contents.StartRate = 64;
            v13.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v13 );

            VibratoConfig v14 = new VibratoConfig();
            v14.author = "Standard";
            v14.file = "slight2_type2.aic";
            v14.number = 14;
            v14.vendor = "YAMAHA";
            v14.contents.IconID = "$0404000e";
            v14.contents.IDS = "slight";
            v14.contents.Original = 0;
            v14.contents.Caption = "[Slight] Type 2";
            v14.contents.setLength( 480 );
            v14.contents.StartDepth = 40;
            v14.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v14.contents.StartRate = 64;
            v14.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v14 );

            VibratoConfig v15 = new VibratoConfig();
            v15.author = "Standard";
            v15.file = "slight2_type3.aic";
            v15.number = 15;
            v15.vendor = "YAMAHA";
            v15.contents.IconID = "$0404000f";
            v15.contents.IDS = "slight";
            v15.contents.Original = 0;
            v15.contents.Caption = "[Slight] Type 3";
            v15.contents.setLength( 480 );
            v15.contents.StartDepth = 72;
            v15.contents.DepthBP = new VibratoBPList( new float[] { }, new int[] { } );
            v15.contents.StartRate = 64;
            v15.contents.RateBP = new VibratoBPList( new float[] { }, new int[] { } );
            ret.m_vibrato_configs.add( v15 );

            VibratoConfig v16 = new VibratoConfig();
            v16.author = "Standard";
            v16.file = "slight2_type4.aic";
            v16.number = 16;
            v16.vendor = "YAMAHA";
            v16.contents.IconID = "$04040010";
            v16.contents.IDS = "slight";
            v16.contents.Original = 0;
            v16.contents.Caption = "[Slight] Type 4";
            v16.contents.setLength( 480 );
            v16.contents.StartDepth = 64;
            v16.contents.DepthBP = new VibratoBPList( new float[] { 0.6042f, 0.6125f, 0.6167f, 0.6208f, 0.625f, 0.6333f, 0.6375f, 0.6417f, 0.6458f, 0.6542f, 0.6583f, 0.6667f, 0.6708f, 0.675f, 0.6792f, 0.6833f, 0.6917f, 0.6958f, 0.7042f, 0.7083f, 0.7125f, 0.7167f, 0.7208f, 0.725f, 0.7292f, 0.7375f, 0.7458f, 0.75f, 0.7583f, 0.7625f, 0.7667f, 0.7708f, 0.775f, 0.7833f, 0.7917f, 0.7958f, 0.8f, 0.8042f, 0.8083f, 0.8125f, 0.8208f, 0.8292f, 0.8375f, 0.8417f, 0.8458f, 0.85f, 0.8542f, 0.8625f, 0.8667f, 0.875f, 0.8792f, 0.8833f, 0.8875f, 0.8917f, 0.8958f, 0.9f, 1f }, new int[] { 64, 63, 62, 61, 59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 34, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 } );
            v16.contents.StartRate = 64;
            v16.contents.RateBP = new VibratoBPList( new float[] { 0.6042f, 0.6125f, 0.6167f, 0.6208f, 0.625f, 0.6333f, 0.6375f, 0.6417f, 0.6458f, 0.6542f, 0.6583f, 0.6667f, 0.6708f, 0.675f, 0.6792f, 0.6833f, 0.6917f, 0.6958f, 0.7042f, 0.7083f, 0.7125f, 0.7167f, 0.7208f, 0.725f, 0.7292f, 0.7375f, 0.7458f, 0.75f, 0.7583f, 0.7625f, 0.7667f, 0.7708f, 0.775f, 0.7833f, 0.7917f, 0.7958f, 0.8f, 0.8042f, 0.8083f, 0.8125f, 0.8208f, 0.8292f, 0.8375f, 0.8417f, 0.8458f, 0.85f, 0.8542f, 0.8625f, 0.8667f, 0.875f, 0.8792f, 0.8833f, 0.8875f, 0.8917f, 0.8958f, 0.9f, 1f }, new int[] { 64, 63, 62, 61, 59, 58, 57, 56, 55, 54, 52, 51, 50, 49, 48, 47, 45, 44, 43, 42, 41, 40, 39, 38, 37, 35, 34, 32, 31, 30, 29, 28, 27, 25, 24, 23, 22, 21, 20, 19, 17, 15, 14, 13, 12, 11, 10, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0 } );
            ret.m_vibrato_configs.add( v16 );

            return ret;
        }

        public int getVibratoConfigCount() {
            return m_vibrato_configs.size();
        }

        public int getAttackConfigCount() {
            return m_attack_configs.size();
        }

        public Iterator vibratoConfigIterator() {
#if JAVA
            return m_vibrato_configs.iterator();
#else
            return new ListIterator<VibratoConfig>( m_vibrato_configs );
#endif
        }

        public Iterator attackConfigIterator() {
#if JAVA
            return m_attack_configs.iterator();
#else
            return new ListIterator<AttackConfig>( m_attack_configs );
#endif
        }

        private ExpressionConfigSys() {
        }

        public ExpressionConfigSys( String path_expdb ) {
            m_vibrato_configs = new Vector<VibratoConfig>();
            m_attack_configs = new Vector<AttackConfig>();
            String expression = PortUtil.combinePath( path_expdb, "expression.map" );
            if ( !PortUtil.isFileExists( expression ) ) {
#if DEBUG
                PortUtil.println( "ExpressionConfigSys#.ctor; expression.map does not exist" );
#endif
                return;
            }

            RandomAccessFile fs = null;
            try {
                fs = new RandomAccessFile( expression, "r" );
                byte[] dat = new byte[8];
                fs.seek( 0x20 );
                for ( int i = 0; i < MAX_VIBRATO; i++ ) {
                    fs.read( dat, 0, 8 );
                    long value = VocaloSysUtil.makelong_le( dat );
                    if ( value <= 0 ) {
                        continue;
                    }

                    String ved = PortUtil.combinePath( path_expdb, "vexp" + value + ".ved" );
                    if ( !PortUtil.isFileExists( ved ) ) {
                        continue;
                    }
                    String vexp_dir = PortUtil.combinePath( path_expdb, "vexp" + value );
                    if ( !PortUtil.isFileExists( vexp_dir ) ) {
                        continue;
                    }

#if DEBUG
                    PortUtil.println( "ExpresionConfigSys#.ctor; ved=" + ved + "; vexp_dir=" + vexp_dir );
#endif
                    String NL = (char)0x0D + "" + (char)0x0A;
                    RandomAccessFile fs_ved = null;
                    try {
                        fs_ved = new RandomAccessFile( ved, "r" );
                        byte[] byte_ved = new byte[(int)fs_ved.length()];
                        fs_ved.read( byte_ved, 0, byte_ved.Length );
                        TransCodeUtil.decodeBytes( byte_ved );
                        String str = PortUtil.getDecodedString( "ASCII", byte_ved );
#if DEBUG
                        String txt_file = PortUtil.combinePath( path_expdb, "vexp" + value + ".txt" );
                        using ( System.IO.StreamWriter sw = new System.IO.StreamWriter( txt_file ) ) {
                            sw.Write( str );
                        }
#endif
                        String[] spl = PortUtil.splitString( str, new String[] { NL }, true );
                        String current_entry = "";
                        for ( int j = 0; j < spl.Length; j++ ) {
#if DEBUG
                            //PortUtil.println( "ExpressionConfigSys#.ctor; line=" + spl[j] );
#endif
                            if ( spl[j].StartsWith( "[" ) ) {
                                current_entry = spl[j];
                                continue;
                            } else if ( spl[j].Equals( "" ) ) {
                                continue;
                            }
                            if ( current_entry.Equals( "[VIBRATO]" ) ) {
                                String[] spl2 = PortUtil.splitString( spl[j], ',' );
                                if ( spl2.Length < 6 ) {
                                    continue;
                                }
                                // ex: 1,1,"normal","normal2_type1.aic","[Normal]:Type:1","Standard","YAMAHA",0
                                VibratoConfig item = new VibratoConfig();
                                item.number = PortUtil.parseInt( spl2[0] );
                                item.contents.IDS = spl2[2].Replace( "\"", "" );
                                item.file = spl2[3].Replace( "\"", "" );
                                item.contents.Caption = spl2[4].Replace( ":", " " ).Replace( "\"", "" );
                                item.author = spl2[5].Replace( "\"", "" );
                                item.vendor = spl2[6].Replace( "\"", "" );
                                item.contents.IconID = "$0404" + PortUtil.toHexString( item.number, 4 );
                                String aic_file = PortUtil.combinePath( vexp_dir, item.file );
                                if ( !PortUtil.isFileExists( aic_file ) ) {
                                    continue;
                                }
                                item.parseAic( aic_file );
                                m_vibrato_configs.add( item );
                            } if ( current_entry.Equals( "[NOTEATTACK]" ) ) {
                                String[] spl2 = PortUtil.splitString( spl[j], ',' );
                                if ( spl2.Length < 6 ) {
                                    continue;
                                }
                                // ex: 1,1,"normal","normal2_type1.aic","[Normal]:Type:1","Standard","YAMAHA",0
                                AttackConfig item = new AttackConfig();
                                item.number = PortUtil.parseInt( spl2[0] );
                                item.contents.IDS = spl2[2].Replace( "\"", "" );
                                item.file = spl2[3].Replace( "\"", "" );
                                item.contents.Caption = spl2[4].Replace( ":", " " ).Replace( "\"", "" );
                                item.author = spl2[5].Replace( "\"", "" );
                                item.vendor = spl2[6].Replace( "\"", "" );
                                item.contents.IconID = "$0101" + PortUtil.toHexString( item.number, 4 );
                                String aic_file = PortUtil.combinePath( vexp_dir, item.file );
                                if ( !PortUtil.isFileExists( aic_file ) ) {
                                    continue;
                                }
                                item.parseAic( aic_file );
                                m_attack_configs.add( item );
                            }
                        }
                    } catch ( Exception ex ) {
#if DEBUG
                        PortUtil.println( "ExpressionConfigSys#.ctor; ex=" + ex );
#endif
                    } finally {
                        if ( fs_ved != null ) {
                            try {
                                fs_ved.close();
                            } catch ( Exception ex2 ) {
#if DEBUG
                                PortUtil.println( "ExpressionConfigSys#.ctor; ex2=" + ex2 );
#endif
                            }
                        }
                    }
                }
            } catch ( Exception ex ) {
#if DEBUG
                PortUtil.println( "ExpressionConfigSys#.ctor; ex=" + ex );
#endif
            } finally {
                if ( fs != null ) {
                    try {
                        fs.close();
                    } catch ( Exception ex2 ) {
#if DEBUG
                        PortUtil.println( "ExpressionConfigSys#.ctor; ex2=" + ex2 );
#endif
                    }
                }
            }
        }

    }

#if !JAVA
}
#endif
