OSDN Git Service

空インタフェース対応
[mikutoga/TogaGem.git] / src / main / java / jp / sourceforge / mikutoga / vmd / VmdConst.java
1 /*
2  * VMD constant data
3  *
4  * License : The MIT License
5  * Copyright(c) 2011 MikuToga Partners
6  */
7
8 package jp.sourceforge.mikutoga.vmd;
9
10 import java.nio.charset.Charset;
11
12 /**
13  * VMDファイルフォーマットの各種定数。
14  */
15 public final class VmdConst {
16
17     /**
18      * VMDファイルヘッダ長。バイト単位。
19      */
20     public static final int HEADER_LENGTH = 30;
21
22     /**
23      * ファイルヘッダ部先頭のASCIIコード相当部。
24      */
25     public static final String MAGIC_TXT = "Vocaloid Motion Data 0002";
26
27     /**
28      * モデル名最大長。バイト単位。
29      */
30     public static final int MODELNAME_MAX = 20;
31
32     /**
33      * ボーン名最大長。バイト単位。
34      */
35     public static final int BONENAME_MAX = 15;
36
37     /**
38      * モーフ名最大長。バイト単位。
39      */
40     public static final int MORPHNAME_MAX = 15;
41
42     /**
43      * カメラもしくはライティングデータに便宜上割り当てられるモデル名。
44      */
45     public static final String MODELNAME_STAGEACT =
46             "\u30ab\u30e1\u30e9\u30fb\u7167\u660e"; // "カメラ・照明";
47
48     /**
49      * 便宜上割り振られる特殊なモーフ名。
50      */
51     public static final String MORPHNAME_BASE = "base";
52
53
54     private static final Charset CS_ASCII = Charset.forName("US-ASCII");
55     private static final byte[] MAGIC_BYTES;
56
57
58     static{
59         MAGIC_BYTES = createMagicHeader();
60         assert MAGIC_BYTES.length <= HEADER_LENGTH;
61
62         assert "カメラ・照明".equals(MODELNAME_STAGEACT);
63     }
64
65
66     /**
67      * 隠しコンストラクタ。
68      */
69     private VmdConst(){
70         super();
71         assert false;
72         throw new AssertionError();
73     }
74
75     /**
76      * ヘッダ先頭のマジックバイト列を生成する。
77      * @return マジックバイト列
78      */
79     public static byte[] createMagicHeader(){
80         byte[] result = (MAGIC_TXT + '\0').getBytes(CS_ASCII);
81         return result;
82     }
83
84     /**
85      * バイト列先頭がマジックヘッダで始まるか検査する。
86      * @param array 検査対象のバイト列。
87      * @return マジックヘッダが検出されればtrue。
88      */
89     public static boolean startsWithMagic(byte[] array){
90         if(MAGIC_BYTES.length > array.length) return false;
91
92         for(int idx = 0; idx < MAGIC_BYTES.length; idx++){
93             if(array[idx] != MAGIC_BYTES[idx]) return false;
94         }
95
96         return true;
97     }
98
99     /**
100      * カメラやライティングなどのステージ演出データの可能性があるか、
101      * モデル名から推測する。
102      * モデル名が"カメラ・照明"である場合、
103      * そのモーションファイルはほぼ
104      * カメラ・ライティング用ステージ演出データであると推測される。
105      * @param modelName モデル名
106      * @return モデル名にカメラもしくはライティングの可能性があるならtrue
107      */
108     public static boolean isStageActName(String modelName){
109         if(MODELNAME_STAGEACT.equals(modelName)) return true;
110         return false;
111     }
112
113     /**
114      * 特殊なモーフ名「base」か否か判定する。
115      * @param morphName モーフ名
116      * @return モーフ名が「base」ならtrue
117      */
118     public static boolean isBaseMorphName(String morphName){
119         if(MORPHNAME_BASE.equals(morphName)) return true;
120         return false;
121     }
122
123 }