/* * VsqHandle.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.io; using bocoree.java.util; namespace Boare.Lib.Vsq { using boolean = System.Boolean; using Integer = System.Int32; #endif /// /// ハンドルを取り扱います。ハンドルにはLyricHandle、VibratoHandle、IconHandleおよびNoteHeadHandleがある /// #if JAVA public class VsqHandle implements Serializable { #else [Serializable] public class VsqHandle { #endif public VsqHandleType m_type; public int Index; public String IconID = ""; public String IDS = ""; public Lyric L0; public Vector Trailing = new Vector(); public int Original; public String Caption = ""; public int Length; public int StartDepth; public VibratoBPList DepthBP; public int StartRate; public VibratoBPList RateBP; public int Language; public int Program; public int Duration; public int Depth; public VsqHandle() { } public int getLength() { return Length; } public void setLength( int value ) { Length = value; } public LyricHandle castToLyricHandle() { LyricHandle ret = new LyricHandle(); ret.L0 = L0; ret.Index = Index; ret.Trailing = Trailing; return ret; } public VibratoHandle castToVibratoHandle() { VibratoHandle ret = new VibratoHandle(); ret.Index = Index; ret.Caption = Caption; ret.DepthBP = (VibratoBPList)DepthBP.clone(); ret.IconID = IconID; ret.IDS = IDS; ret.Index = Index; ret.setLength( Length ); ret.Original = Original; ret.RateBP = (VibratoBPList)RateBP.clone(); ret.StartDepth = StartDepth; ret.StartRate = StartRate; return ret; } public IconHandle castToIconHandle() { IconHandle ret = new IconHandle(); ret.Index = Index; ret.Caption = Caption; ret.IconID = IconID; ret.IDS = IDS; ret.Index = Index; ret.Language = Language; ret.setLength( Length ); ret.Original = Original; ret.Program = Program; return ret; } public NoteHeadHandle castToNoteHeadHandle() { NoteHeadHandle ret = new NoteHeadHandle(); ret.Caption = Caption; ret.Depth = Depth; ret.Duration = Duration; ret.IconID = IconID; ret.IDS = IDS; ret.setLength( Length ); ret.Original = Original; return ret; } /// /// インスタンスをストリームに書き込みます。 /// encode=trueの場合、2バイト文字をエンコードして出力します。 /// /// 書き込み対象 private void writeCor( ITextWriter sw ) #if JAVA throws IOException #endif { sw.writeLine( this.toString() ); } public void write( TextMemoryStream sw ) #if JAVA throws IOException #endif { writeCor( sw ); } public void write( BufferedWriter sw ) #if JAVA throws IOException #endif { writeCor( new WrappedStreamWriter( sw ) ); } /// /// FileStreamから読み込みながらコンストラクト /// /// 読み込み対象 public VsqHandle( TextMemoryStream sr, int value, ByRef last_line ) { this.Index = value; String[] spl; String[] spl2; // default値で梅 m_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; Language = 0; Program = 0; Duration = 0; Depth = 64; String tmpDepthBPX = ""; String tmpDepthBPY = ""; String tmpRateBPX = ""; String tmpRateBPY = ""; // "["にぶち当たるまで読込む last_line.value = sr.readLine(); while ( !last_line.value.StartsWith( "[" ) ) { spl = PortUtil.splitString( last_line.value, new char[] { '=' } ); String search = spl[0]; if ( search.Equals( "Language" ) ) { m_type = VsqHandleType.Singer; Language = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "Program" ) ) { Program = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "IconID" ) ) { IconID = spl[1]; } else if ( search.Equals( "IDS" ) ) { IDS = spl[1]; } else if ( search.Equals( "Original" ) ) { Original = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "Caption" ) ) { Caption = spl[1]; for ( int i = 2; i < spl.Length; i++ ) { Caption += "=" + spl[i]; } } else if ( search.Equals( "Length" ) ) { Length = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "StartDepth" ) ) { StartDepth = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "DepthBPNum" ) ) { depth_bp_num = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "DepthBPX" ) ) { tmpDepthBPX = spl[1]; } else if ( search.Equals( "DepthBPY" ) ) { tmpDepthBPY = spl[1]; } else if ( search.Equals( "StartRate" ) ) { m_type = VsqHandleType.Vibrato; StartRate = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "RateBPNum" ) ) { rate_bp_num = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "RateBPX" ) ) { tmpRateBPX = spl[1]; } else if ( search.Equals( "RateBPY" ) ) { tmpRateBPY = spl[1]; } else if ( search.Equals( "Duration" ) ) { m_type = VsqHandleType.NoteHeadHandle; Duration = PortUtil.parseInt( spl[1] ); } else if ( search.Equals( "Depth" ) ) { Duration = PortUtil.parseInt( spl[1] ); } else if ( search.StartsWith( "L" ) && PortUtil.getStringLength( search ) >= 2 ){ String num = search.Substring( 1 ); ByRef vals = new ByRef( 0 ); if( PortUtil.tryParseInt( num, vals ) ){ Lyric lyric = new Lyric( spl[1] ); m_type = VsqHandleType.Lyric; int index = vals.value; if( index == 0 ){ L0 = lyric; }else{ Trailing.set( index - 1, lyric ); } } } if ( sr.peek() < 0 ) { break; } last_line.value = sr.readLine(); } /*if ( IDS != "normal" ) { m_type = VsqHandleType.Singer; } else if ( IconID != "" ) { m_type = VsqHandleType.Vibrato; } else { m_type = VsqHandleType.Lyric; }*/ // RateBPX, RateBPYの設定 if ( m_type == VsqHandleType.Vibrato ) { if ( rate_bp_num > 0 ) { float[] rate_bp_x = new float[rate_bp_num]; spl2 = PortUtil.splitString( tmpRateBPX, new char[] { ',' } ); for ( int i = 0; i < rate_bp_num; i++ ) { rate_bp_x[i] = PortUtil.parseFloat( spl2[i] ); } int[] rate_bp_y = new int[rate_bp_num]; spl2 = PortUtil.splitString( tmpRateBPY, new char[] { ',' } ); for ( int i = 0; i < rate_bp_num; i++ ) { rate_bp_y[i] = PortUtil.parseInt( 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の設定 if ( depth_bp_num > 0 ) { float[] depth_bp_x = new float[depth_bp_num]; spl2 = PortUtil.splitString( tmpDepthBPX, new char[] { ',' } ); for ( int i = 0; i < depth_bp_num; i++ ) { depth_bp_x[i] = PortUtil.parseFloat( spl2[i] ); } int[] depth_bp_y = new int[depth_bp_num]; spl2 = PortUtil.splitString( tmpDepthBPY, new char[] { ',' } ); for ( int i = 0; i < depth_bp_num; i++ ) { depth_bp_y[i] = PortUtil.parseInt( 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(); } } /// /// ハンドル指定子(例えば"h#0123"という文字列)からハンドル番号を取得します /// /// ハンドル指定子 /// ハンドル番号 public static int HandleIndexFromString( String _string ) { String[] spl = PortUtil.splitString( _string, new char[] { '#' } ); return PortUtil.parseInt( spl[1] ); } /// /// インスタンスをテキストファイルに出力します /// /// 出力先 public void print( BufferedWriter sw ) #if JAVA throws IOException #endif { String result = this.ToString(); sw.write( result ); sw.newLine(); } /// /// インスタンスをコンソール画面に出力します /// private void print() { String result = this.ToString(); PortUtil.println( result ); } /// /// インスタンスを文字列に変換します /// /// 2バイト文字をエンコードするか否かを指定するフラグ /// インスタンスを変換した文字列 public String toString() { String result = ""; result += "[h#" + PortUtil.formatDecimal( "0000", Index ) + "]"; if ( m_type == VsqHandleType.Lyric ) { result += "\n" + "L0=" + L0.toString(); int c = Trailing.size(); for( int i = 0; i < c; i++ ){ result += "\n" + "L" + (i + 1) + Trailing.get( i ).toString(); } } else if ( m_type == VsqHandleType.Vibrato ) { result += "\n" + "IconID=" + IconID + "\n"; result += "IDS=" + IDS + "\n"; result += "Original=" + Original + "\n"; result += "Caption=" + Caption + "\n"; result += "Length=" + Length + "\n"; result += "StartDepth=" + StartDepth + "\n"; result += "DepthBPNum=" + DepthBP.getCount() + "\n"; if ( DepthBP.getCount() > 0 ) { result += "DepthBPX=" + PortUtil.formatDecimal( "0.000000", DepthBP.getElement( 0 ).X ); for ( int i = 1; i < DepthBP.getCount(); i++ ) { result += "," + PortUtil.formatDecimal( "0.000000", DepthBP.getElement( i ).X ); } result += "\n" + "DepthBPY=" + DepthBP.getElement( 0 ).Y; for ( int i = 1; i < DepthBP.getCount(); i++ ) { result += "," + DepthBP.getElement( i ).Y; } result += "\n"; } result += "StartRate=" + StartRate + "\n"; result += "RateBPNum=" + RateBP.getCount(); if ( RateBP.getCount() > 0 ) { result += "\n" + "RateBPX=" + PortUtil.formatDecimal( "0.000000", RateBP.getElement( 0 ).X ); for ( int i = 1; i < RateBP.getCount(); i++ ) { result += "," + PortUtil.formatDecimal( "0.000000", RateBP.getElement( i ).X ); } result += "\n" + "RateBPY=" + RateBP.getElement( 0 ).Y; for ( int i = 1; i < RateBP.getCount(); i++ ) { result += "," + RateBP.getElement( i ).Y; } } } else if ( m_type == VsqHandleType.Singer ) { result += "\n" + "IconID=" + IconID + "\n"; result += "IDS=" + IDS + "\n"; result += "Original=" + Original + "\n"; result += "Caption=" + Caption + "\n"; result += "Length=" + Length + "\n"; result += "Language=" + Language + "\n"; result += "Program=" + Program; } else if ( m_type == VsqHandleType.NoteHeadHandle ) { result += "\n" + "IconID=" + IconID + "\n"; result += "IDS=" + IDS + "\n"; result += "Original=" + Original + "\n"; result += "Caption=" + Caption + "\n"; result += "Length=" + Length + "\n"; result += "Duration=" + Duration + "\n"; result += "Depth=" + Depth; } return result; } #if !JAVA public override string ToString() { return toString(); } #endif } #if !JAVA } #endif