• R/O
  • SSH
  • HTTPS

mmdmotion-java: Commit


Commit MetaInfo

Revision66 (tree)
Time2015-11-07 23:13:06
Authornaz_o

Log Message

[MID2Motion-plugin] Drums: left and right hand exclusive flags, etc.

Change Summary

Incremental Difference

--- MID2Motion/trunk/MID2Motion-plugin/src/main/resources/README-SM.txt (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/resources/README-SM.txt (revision 66)
@@ -22,6 +22,20 @@
2222 http://mmdmotion-java.osdn.jp/wiki/MID2Motion/sampler
2323 を参照してください。
2424
25+== ノートナンバー ==
26+
27+自分しか使わないテンプレートは自由にしていいと思いますが、
28+他と組み合わせる場合は、大体こんな風に合わせると分かりやすいかもしれません。
29+
30+0: frame 0 準備態勢
31+1-11: 全体勢関連
32+12-23: 足関連
33+24(c0)-36 は演奏補助関連にするため避ける
34+36(c1)-59 は演奏関連にするため避ける
35+60-71: 上下半身とか
36+72-: 手とか
37+108-: 首とか
38+
2539 = 著作権・ライセンス =
2640 ソースコードの著作権は、Copyright (c) nazo, 2015 です。
2741 MIT ライセンス扱いで、著作権の所在を明示的に示す限り、改変・再配布を許可します。
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/ShoutroidMotionPane.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/ShoutroidMotionPane.java (revision 66)
@@ -99,7 +99,7 @@
9999 JFileChooser jfc=new JFileChooser(s);
100100 jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
101101 jfc.setToolTipText("ファイル名を選ぶ");
102- jfc.setFileFilter(new FileNameExtensionFilter("MMD Motion File", "vmd","csv"));
102+ jfc.setFileFilter(new FileNameExtensionFilter("MMD Motion File (*.vmd, *.csv)", "vmd","csv"));
103103 if(jfc.showSaveDialog(this)!=JFileChooser.APPROVE_OPTION){
104104 return;
105105 }
@@ -112,6 +112,9 @@
112112 motion.toCSV(fos);
113113 fos.close();
114114 }else {
115+ if(!f.getName().toLowerCase().endsWith(".vmd")){
116+ f=new File(f.getParentFile(),f.getName()+".vmd");
117+ }
115118 fos=new FileOutputStream(f);
116119 motion.toVMD(fos);
117120 fos.close();
@@ -140,6 +143,7 @@
140143 progressBar = new javax.swing.JProgressBar();
141144 textLML = new javax.swing.JTextField();
142145 javax.swing.JLabel jLabel2 = new javax.swing.JLabel();
146+ checkPitchAction = new javax.swing.JCheckBox();
143147
144148 setLayout(new java.awt.GridBagLayout());
145149
@@ -197,6 +201,13 @@
197201 gridBagConstraints.gridx = 2;
198202 gridBagConstraints.gridy = 2;
199203 add(jLabel2, gridBagConstraints);
204+
205+ checkPitchAction.setText("ピッチベンドまばたき機能");
206+ gridBagConstraints = new java.awt.GridBagConstraints();
207+ gridBagConstraints.gridx = 1;
208+ gridBagConstraints.gridy = 0;
209+ gridBagConstraints.anchor = java.awt.GridBagConstraints.LINE_START;
210+ add(checkPitchAction, gridBagConstraints);
200211 }// </editor-fold>//GEN-END:initComponents
201212
202213 private void buttonLMLActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_buttonLMLActionPerformed
@@ -235,12 +246,13 @@
235246 return;
236247 }
237248
249+ smb.setPitchAction(checkPitchAction.isSelected());
238250 smb.addProgressListener(this);
239251 buttonProgress.setEnabled(false);
240252 new Thread(new Runnable() {
241- private ProgressLisner perent;
253+ private ProgressLisner parent;
242254 public Runnable setP(ProgressLisner l){
243- perent=l;
255+ parent=l;
244256 return this;
245257 }
246258 @Override
@@ -247,7 +259,7 @@
247259 public void run() {
248260 smb.setMidiResolver(midiR);
249261 smb.loadMessages();
250- smb.removeProgressListener(perent);
262+ smb.removeProgressListener(parent);
251263 }
252264 }.setP(this)).start();
253265 }//GEN-LAST:event_buttonProgressActionPerformed
@@ -264,6 +276,7 @@
264276 // Variables declaration - do not modify//GEN-BEGIN:variables
265277 private javax.swing.JButton buttonLML;
266278 private javax.swing.JButton buttonProgress;
279+ private javax.swing.JCheckBox checkPitchAction;
267280 private javax.swing.JProgressBar progressBar;
268281 private javax.swing.JTextField textLML;
269282 // End of variables declaration//GEN-END:variables
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/SampleMotionPane.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/SampleMotionPane.java (revision 66)
@@ -119,7 +119,7 @@
119119 JFileChooser jfc=new JFileChooser(s);
120120 jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
121121 jfc.setToolTipText("ファイル名を選ぶ");
122- jfc.setFileFilter(new FileNameExtensionFilter("MMD Motion File", "vmd","csv"));
122+ jfc.setFileFilter(new FileNameExtensionFilter("MMD Motion File (*.vmd,*.csv)", "vmd","csv"));
123123 if(jfc.showSaveDialog(this)!=JFileChooser.APPROVE_OPTION){
124124 return;
125125 }
@@ -132,6 +132,9 @@
132132 motion.toCSV(fos);
133133 fos.close();
134134 }else {
135+ if(!f.getName().toLowerCase().endsWith(".vmd")){
136+ f=new File(f.getParentFile(),f.getName()+".vmd");
137+ }
135138 fos=new FileOutputStream(f);
136139 motion.toVMD(fos);
137140 fos.close();
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/ShoutroidMotionBuilder.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/ShoutroidMotionBuilder.java (revision 66)
@@ -1,7 +1,25 @@
11 /*
2- * In Public Domain.
3- * This is an example of MID2Motion plugin (MotionBuilder)
4- * See http://mmdmotion-java.osdn.jp/wiki/MID2Motion for detail.
2+ * The MIT License
3+ *
4+ * Copyright 2015 nazo.
5+ *
6+ * Permission is hereby granted, free of charge, to any person obtaining a copy
7+ * of this software and associated documentation files (the "Software"), to deal
8+ * in the Software without restriction, including without limitation the rights
9+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+ * copies of the Software, and to permit persons to whom the Software is
11+ * furnished to do so, subject to the following conditions:
12+ *
13+ * The above copyright notice and this permission notice shall be included in
14+ * all copies or substantial portions of the Software.
15+ *
16+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22+ * THE SOFTWARE.
523 */
624 package plugin;
725
@@ -34,6 +52,8 @@
3452
3553 private Map<String,Integer> mp;
3654 private int [] chToMorph;
55+ /** ピッチベンドまばたき機能 */
56+ private boolean pitchAction;
3757
3858 public ShoutroidMotionBuilder() {
3959 super();
@@ -40,6 +60,7 @@
4060 mp=new TreeMap<String, Integer>();
4161 chToMorph = new int[16];
4262 motion.setModelName("琴葉茜");
63+ pitchAction=false;
4364 convert=new HashMap<String, String>();
4465 convert.put("あ","a");
4566 convert.put("い","i");
@@ -241,15 +262,16 @@
241262 p.factor=((float)velo)/127;
242263 motion.put(p);
243264
244- p.frame=frame+d-1;
245-// p.factor=((float)velo)/127;
246- motion.put(p);
247-
265+ if(d>1){// 短すぎる(d=0)時にこれを口が開きっぱなしになるから避ける。
266+ p.frame=frame+d-1;
267+ motion.put(p);
268+ }
248269 p.frame=frame+d;
249270 p.factor=0;
250271 motion.put(p);
251- } /*else if(com==ShortMessage.PITCH_BEND){
252- // やめた機能: PITCH_BEND まばたき機能
272+ } if(pitchAction && com==ShortMessage.PITCH_BEND){
273+ // PITCH_BEND まばたき機能: ピッチが高いときに目を細くする。
274+ // 叫んでる感じが出るがビブラートにはよくない
253275 int pitch = sm.getData1() + sm.getData2() * 128 - 8192;
254276 MorphPose p;
255277 p=new MorphPose();
@@ -257,9 +279,25 @@
257279 p.frame=frame;
258280 p.factor=(pitch<0)?0F:((float)pitch)/8192F*0.6F;
259281 motion.put(p);
260- }*/
282+ }
261283 }
262284 }
263285 reportProgressEnd(); /** 処理終了通知. */
264286 }
287+
288+ /**
289+ * ピッチベンドまばたき機能の有無.
290+ * @return ピッチベンドまばたき機能が設定されていると true.
291+ */
292+ public boolean isPitchAction() {
293+ return pitchAction;
294+ }
295+
296+ /**
297+ * ピッチベンドまばたき機能のon/off.
298+ * @param pitchAction true: on, false: off. デフォルトはfalse.
299+ */
300+ public void setPitchAction(boolean pitchAction) {
301+ this.pitchAction = pitchAction;
302+ }
265303 }
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/KeyboardMotionFingerMap.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/KeyboardMotionFingerMap.java (revision 66)
@@ -83,19 +83,29 @@
8383 /**
8484 * 指譜の CVS 1 行からコンストラクト.
8585 * @param csv 指譜の CVS 1 行
86+ * @throws NumberFormatException 数字の場所に数字が書いてない.
8687 */
87- public TAB(String csv){
88+ public TAB(String csv) throws NumberFormatException {
8889 String []p =CsvSpliter.split(csv);
8990 // if(p[0].charAt(0)==';')
90- this.frame=Integer.parseInt(p[0]);
91- this.velocity=Byte.parseByte(p[1]);
91+ frame=Integer.parseInt(p[0]);
92+ velocity=Byte.parseByte(p[1]);
93+
9294 int i;
9395 for(i=0;i<5;i++){
94- this.noteList[i]=Integer.parseInt(p[i+2]);
96+ if(onList[i]=!p[i+2].contains("x")){ // on の可能性
97+ if(p[i+2].startsWith("-")){ // -0 という表記もある
98+ noteList[i]=-Integer.parseInt(p[i+2]);
99+ onList[i]=false;
100+ }else {
101+ noteList[i]=Integer.parseInt(p[i+2]);
102+ onList[i]=true;
103+ }
104+ } else {
105+ noteList[i]=-1;
106+ onList[i]=false;
107+ }
95108 }
96- for(i=0;i<5;i++){
97- this.onList[i]=p[i+7].contains("o");
98- }
99109 }
100110
101111 /**
@@ -116,14 +126,11 @@
116126 String ret=frame+","+velocity;
117127 int i;
118128 for(i=0;i<5;i++){
119- ret+=","+noteList[i];
129+ ret+=",";
130+ ret+=(noteList[i]==-1)?'x':((onList[i])?"":'-')+String.valueOf(noteList[i]);
120131 }
121- for(i=0;i<5;i++){
122- ret+=","+((onList[i])?'o':'x');
123- }
124132 return ret;
125133 }
126-
127134 }
128135
129136 /**
@@ -135,8 +142,9 @@
135142 public int compare(Integer o1, Integer o2) {
136143 return o2-o1;
137144 }
138-
139145 }
146+
147+
140148 protected int LR_index;
141149
142150 protected TreeMap<Integer,TAB> frame2TAB=new TreeMap<Integer,TAB>();
@@ -149,6 +157,7 @@
149157 noteNumber2Finger=new TreeMap<Integer,Finger>();
150158 }
151159 }
160+
152161 /**
153162 * 指譜のコンストラクタ
154163 * @param LR 0: 左, 1: 右
@@ -167,7 +176,7 @@
167176 * @param is InputStream of CSV
168177 * @throws IOException IO Error(unreadable)
169178 */
170- public KeyboardMotionFingerMap(int LR,InputStream is) throws IOException{
179+ public KeyboardMotionFingerMap(int LR,InputStream is) throws IOException {
171180 LR_index=LR;
172181 init();
173182
@@ -174,6 +183,7 @@
174183 BufferedReader br=new BufferedReader(new InputStreamReader(is,"MS932"));
175184 String line;
176185 TAB tab;
186+
177187 while ((line=br.readLine())!=null){
178188 tab=new TAB(line);
179189 this.frame2TAB.put(tab.frame,tab);
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/BassMotionPane.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/BassMotionPane.java (revision 66)
@@ -1,5 +1,3 @@
1-package plugin;
2-
31 /*
42 * The MIT License
53 *
@@ -23,6 +21,7 @@
2321 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2422 * THE SOFTWARE.
2523 */
24+package plugin;
2625
2726 import java.io.File;
2827 import java.io.FileInputStream;
@@ -120,7 +119,7 @@
120119 JFileChooser jfc=new JFileChooser(s);
121120 jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
122121 jfc.setToolTipText("ファイル名を選ぶ");
123- jfc.setFileFilter(new FileNameExtensionFilter("MMD Motion File", "vmd","csv"));
122+ jfc.setFileFilter(new FileNameExtensionFilter("MMD Motion File (*.vmd,*.csv)", "vmd","csv"));
124123 if(jfc.showSaveDialog(this)!=JFileChooser.APPROVE_OPTION){
125124 return;
126125 }
@@ -133,6 +132,9 @@
133132 motion.toVMD(fos);
134133 fos.close();
135134 }else {
135+ if(!f.getName().toLowerCase().endsWith(".vmd")){
136+ f=new File(f.getParentFile(),f.getName()+".vmd");
137+ }
136138 fos=new FileOutputStream(f);
137139 motion.toCSV(fos);
138140 fos.close();
@@ -292,9 +294,9 @@
292294 bmb.addProgressListener(this);
293295 buttonProgress.setEnabled(false);
294296 new Thread(new Runnable() {
295- private ProgressLisner perent;
297+ private ProgressLisner parent;
296298 public Runnable setP(ProgressLisner l){
297- perent=l;
299+ parent=l;
298300 return this;
299301 }
300302 @Override
@@ -301,7 +303,7 @@
301303 public void run() {
302304 bmb.setMidiResolver(midiR);
303305 bmb.loadMessages();
304- bmb.removeProgressListener(perent);
306+ bmb.removeProgressListener(parent);
305307 }
306308 }.setP(this)).start();
307309 }//GEN-LAST:event_buttonProgressActionPerformed
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/ExampleMotionPane.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/ExampleMotionPane.java (revision 66)
@@ -119,7 +119,7 @@
119119 JFileChooser jfc=new JFileChooser(s);
120120 jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
121121 jfc.setToolTipText("ファイル名を選ぶ");
122- jfc.setFileFilter(new FileNameExtensionFilter("MMD Motion File", "vmd","csv"));
122+ jfc.setFileFilter(new FileNameExtensionFilter("MMD Motion File (*.vmd,*.csv)", "vmd","csv"));
123123 if(jfc.showSaveDialog(this)!=JFileChooser.APPROVE_OPTION){
124124 return;
125125 }
@@ -132,6 +132,9 @@
132132 motion.toCSV(fos);
133133 fos.close();
134134 }else {
135+ if(!f.getName().toLowerCase().endsWith(".vmd")){
136+ f=new File(f.getParentFile(),f.getName()+".vmd");
137+ }
135138 fos=new FileOutputStream(f);
136139 motion.toVMD(fos);
137140 fos.close();
@@ -295,16 +298,17 @@
295298 emb.addProgressListener(this);
296299 buttonProgress.setEnabled(false);
297300 new Thread(new Runnable() {
298- private ProgressLisner perent;
301+ private ProgressLisner parent;
299302 public Runnable setP(ProgressLisner l){
300- perent=l;
303+ parent=l;
301304 return this;
302305 }
306+
303307 @Override
304308 public void run() {
305309 emb.setMidiResolver(midiR);
306310 emb.loadMessages();
307- emb.removeProgressListener(perent);
311+ emb.removeProgressListener(parent);
308312 }
309313 }.setP(this)).start();
310314 }//GEN-LAST:event_buttonProgressActionPerformed
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/DrumsMotionBuilder.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/DrumsMotionBuilder.java (revision 66)
@@ -29,11 +29,13 @@
2929 import java.io.InputStreamReader;
3030 import java.util.Map;
3131 import java.util.TreeMap;
32+import java.util.ArrayList;
3233 import javax.sound.midi.MidiEvent;
3334 import javax.sound.midi.ShortMessage;
3435 import jp.sourceforge.mmd.midiMotion.MotionBuilder;
3536 import jp.sourceforge.mmd.motion.BonePose;
3637 import jp.sourceforge.mmd.motion.CsvSpliter;
38+import jp.sourceforge.mmd.motion.MorphPose;
3739 import jp.sourceforge.mmd.motion.geo.Matrix;
3840 import jp.sourceforge.mmd.motion.Motion;
3941 import jp.sourceforge.mmd.motion.Pose;
@@ -48,16 +50,25 @@
4850 protected Motion playerTemp;
4951 protected Motion drumTemp;
5052 protected Motion player;
51- protected Map<Integer,int[]> note2frames;
53+ protected Map<Integer,ArrayList<Integer[]>> note2frames;
5254 protected boolean openHH;
5355
56+ private int rightHand;
57+ private int leftHand;
58+ private int bodyAngle_time;
59+ private int bodyAngle;
60+
5461 public DrumsMotionBuilder(){
5562 super();
5663 this.openHH = true;
5764 player=new Motion();
58- note2frames=new TreeMap<Integer, int[]>();
65+ note2frames=new TreeMap<Integer, ArrayList<Integer[]>>();
5966 playerTemp=null;
6067 drumTemp=null;
68+ rightHand=-1;
69+ leftHand=-1;
70+ bodyAngle=0;
71+ bodyAngle_time=-1;
6172 }
6273
6374 public void setTemplate(Motion drum,Motion player){
@@ -75,15 +86,22 @@
7586 line=br.readLine();
7687 if(line.charAt(0)==';')continue;
7788 p=CsvSpliter.split(line);
78- note2frames.put(new Integer(p[5]),
79- new int []{
80- Integer.parseInt(p[1]),//from
81- Integer.parseInt(p[2]),//hit
82- Integer.parseInt(p[3]),//player
83- Integer.parseInt(p[4]),//drum
84- Integer.parseInt(p[6]),// hh preopen
85- Integer.parseInt(p[7])// hh afteropen
86- });
89+ ArrayList<Integer[]> list=note2frames.get(new Integer(p[5]));
90+ if(list==null){
91+ list = new ArrayList<Integer []>();
92+ }
93+ list.add(new Integer []{
94+ new Integer(p[1]),//0:from
95+ new Integer(p[2]),//1:hit
96+ new Integer(p[3]),//2:player
97+ new Integer(p[4]),//3:drum
98+ new Integer(p[6]),//4:hh preopen
99+ new Integer(p[7]),//5:hh afteropen
100+ new Integer(p[8]),//6:left
101+ new Integer(p[9]),//7:right
102+ p[10].contains("n")?null:new Integer((int)(Float.parseFloat(p[10])*100))//8:body
103+ });
104+ note2frames.put(new Integer(p[5]),list);
87105 }
88106 }
89107
@@ -97,15 +115,9 @@
97115 }
98116
99117 ShortMessage sm;
118+ int frame;
100119 int com;
101- int note;
102- int vel;
103- int frame;
104- int put_frame;
105- int i,j;
106- BonePose p;
107- Pose<?> [] ps;
108- int []list;
120+ int i;
109121 MidiEvent [] drums=mm.getChannelMessage(9);
110122
111123 for(i=0;i<9;i++){
@@ -117,59 +129,113 @@
117129
118130 for(MidiEvent me:drums){
119131 sm=(ShortMessage)me.getMessage();
132+ frame=ticsToFrame(me.getTick());
133+ reportProgress(frame);
120134 if((com=sm.getCommand())==ShortMessage.NOTE_ON){
121- note=sm.getData1();
122- vel=sm.getData2();
123- frame=ticsToFrame(me.getTick());
124- reportProgress(frame);
135+ keyOn(frame,sm.getData1(),sm.getData2());
136+ }/*end of noteON*/
137+ }
125138
126- list=note2frames.get(note);
127- if(list==null)continue;
139+ player.putAll(playerTemp.get(0),0);
140+ motion.putAll(drumTemp.get(0),0);
128141
129- if((list[4]==-1) && openHH){//close
130- ps=drumTemp.get(note2frames.get(257)[1]);
131- motion.putAll(ps, frame+list[0]-list[1]-1);
132- ps=playerTemp.get(note2frames.get(257)[1]);
133- player.putAll(ps, frame+list[0]-list[1]-1);
134- } else if((list[4]==1) && (!openHH) ){//open
135- ps=drumTemp.get(note2frames.get(258)[1]);
136- motion.putAll(ps, frame+list[0]-list[1]-1);
137- ps=playerTemp.get(note2frames.get(258)[1]);
138- player.putAll(ps, frame+list[0]-list[1]-1);
139- }
142+ reportProgressEnd();
143+ }
140144
141- j=list[0];
142- for(i=0;i<list[3];i++){
143- ps = drumTemp.get(j);
144- put_frame=i+frame+list[0]-list[1];
145- motion.putAll(ps, put_frame);
146- j++;
145+ private void keyOn(int frame,int note,int vel){
146+ ArrayList<Integer[]> alist=note2frames.get(note);
147+ if(alist==null)return;
148+
149+ Integer [] list=null;
150+ Pose<?> [] ps;
151+ int i,j;
152+
153+ if(alist.size()==1){
154+ list=alist.get(0);
155+ } else {
156+ if(bodyAngle_time>=frame){
157+ for(Integer [] o:alist){
158+ if(o[8]==bodyAngle){
159+ list=o;
160+ break;
161+ }
147162 }
163+ } else if(rightHand>=frame) {
164+ for(Integer [] o:alist){
165+ if(o[7]==0){
166+ list=o;
167+ break;
168+ }
169+ }
170+ } else if(leftHand>=frame) {
171+ for(Integer [] o:alist){
172+ if(o[6]==0){
173+ list=o;
174+ break;
175+ }
176+ }
177+ }else {
178+ list=alist.get(0);
179+ }
180+ if(list==null){
181+ System.err.println("drum: frame: "+frame+", note: "+note+", alist size:"+alist.size());
182+ System.err.println("drum: body:"+bodyAngle+" left:"+leftHand+" right:"+rightHand);
183+ return;
184+ }
185+ }
148186
149- j=list[0];
150- Pose<?> [] hit=playerTemp.get(list[1]);
151- for(i=0;i<list[2];i++){
152- ps = playerTemp.get(j);
153- if(hit!=null && note!=36 && note!=35 && i<list[1]-list[0] && ps!=null){
154- swing(vel,ps,hit);
187+ if((list[4]==-1) && openHH){ // hit hat mode:close
188+ ps=drumTemp.get(note2frames.get(257).get(0)[1]);
189+ motion.putAll(ps, frame+list[0]-list[1]-1);
190+ ps=playerTemp.get(note2frames.get(257).get(0)[1]);
191+ player.putAll(ps, frame+list[0]-list[1]-1);
192+ } else if((list[4]==1) && (!openHH) ){//open
193+ ps=drumTemp.get(note2frames.get(258).get(0)[1]);
194+ motion.putAll(ps, frame+list[0]-list[1]-1);
195+ ps=playerTemp.get(note2frames.get(258).get(0)[1]);
196+ player.putAll(ps, frame+list[0]-list[1]-1);
197+ }
198+
199+ j=list[0];
200+ for(i=0;i<list[3];i++){
201+ ps = drumTemp.get(j);
202+ motion.putAll(ps, i+frame+list[0]-list[1]);
203+ j++;
204+ }
205+
206+ j=list[0];
207+ Pose<?> [] hit=playerTemp.get(list[1]);
208+ for(i=0;i<list[2];i++){
209+ ps = playerTemp.get(j);
210+ if(hit!=null){
211+ for(Pose<?> p:hit){ // hit に存在する同名のキーを削除
212+ if(p instanceof BonePose){
213+ player.remove(frame+j-list[1],p.nameOfBone);
214+ }else if(p instanceof MorphPose){
215+ player.removeMorph(frame+j-list[1], p.nameOfBone);
155216 }
156- put_frame=i+frame+list[0]-list[1];
157- player.putAll(ps, put_frame);
158- j++;
159217 }
160- openHH=(list[5]>0)?true:((list[5]<0)?false:openHH);
161- }/*end of noteON*/
218+ if(note!=36 && note!=35 && j<list[1] && ps!=null){
219+ swing(vel,ps,hit);
220+ }
221+ }
222+ player.putAll(ps, frame+j-list[1]);
223+ j++;
162224 }
225+ if(list[6]!=0){
226+ leftHand=frame+list[0]-list[1]+list[2];
227+ }
228+ if(list[7]!=0){
229+ rightHand=frame+list[0]-list[1]+list[2];
230+ }
231+ if(list[8]!=null){
232+ bodyAngle_time=frame+list[1]-list[0];
233+ bodyAngle=list[8];
234+ }
163235
164- ps = playerTemp.get(0);
165- player.putAll(ps,0);
166- ps = drumTemp.get(0);
167- motion.putAll(ps,0);
168-
169- reportProgressEnd();
236+ openHH=(list[5]>0)?true:((list[5]<0)?false:openHH);
170237 }
171238
172-
173239 public Motion getMotionPlayer(){
174240 return player;
175241 }
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/KeyboardMotionPane.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/KeyboardMotionPane.java (revision 66)
@@ -588,15 +588,15 @@
588588 buttonProgress.setEnabled(false);
589589 kbmb.setMidiResolver(midiR);
590590 new Thread(new Runnable() {
591- private ProgressLisner perent;
591+ private ProgressLisner parent;
592592 public Runnable setP(ProgressLisner l){
593- perent=l;
593+ parent=l;
594594 return this;
595595 }
596596 @Override
597597 public void run() {
598598 kbmb.loadMessages();
599- kbmb.removeProgressListener(perent);
599+ kbmb.removeProgressListener(parent);
600600 }
601601 }.setP(this)).start();
602602 }//GEN-LAST:event_buttonProgressActionPerformed
--- MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/KeyboardMotionBuilder.java (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/src/main/java/plugin/KeyboardMotionBuilder.java (revision 66)
@@ -55,6 +55,7 @@
5555 static final public int PROTOCOL_VORONOI = 1;
5656
5757 private Motion player = null;
58+// private Motion player_output = null;
5859 private Model playerModel = null;
5960 private Model keyModel = null;
6061
@@ -122,8 +123,14 @@
122123 if (playerModel == null) return;
123124 if (motion == null) {
124125 this.player = new Motion(model.getName());
126+// player_output=new Motion(model.getName());
125127 } else {
126128 this.player = motion;
129+// player_output=new Motion(motion.getModelName());
130+// for(int frame=0;frame<motion.getMaxFrame();frame++){
131+// Pose<?> []ps= motion.get(frame);
132+// player_output.putAll(ps, frame);
133+ }
127134 }
128135
129136 if(keyModel != null){
@@ -134,13 +141,13 @@
134141 for(int i=0;i<2;i++){
135142 iksArm[i] = new IKSolver();
136143 iksArm[i].setBones(new Bone[]{playerModel.get(PartName.makeArm(i,0)),
137- playerModel.get(PartName.makeArm(i,1)),
138- playerModel.get(PartName.makeArm(i,2))
144+ playerModel.get(PartName.makeArm(i,1)),
145+ playerModel.get(PartName.makeArm(i,2))
139146 });
140147 iksArm[i].setLimits(0,IKSolver.RLIMIT_NOGlobalR);
141148 iksArm[i].setLimits(1, IKSolver.RLIMIT_NOZ | IKSolver.RLIMIT_NOX);
142149 }
143- }catch(NullPointerException ex){
150+ } catch(NullPointerException ex){
144151 throw new MmdFormatException("特定の指ボーンが見つかりません."+ex.getLocalizedMessage());
145152 }
146153 }
@@ -322,25 +329,33 @@
322329 }
323330 }
324331
332+ /** 最後にもう一周 */
325333 if (playerModel != null) {
326334 KeyboardMotionFingerMap.TAB pre_tab;
327335 for(int LR_index=0;LR_index<2;LR_index++){
328336 pre_tab=null;
329- for(KeyboardMotionFingerMap.TAB tab:fingerMap[LR_index].getTAB()){
330- reportProgress(tab.frame);
331-
337+ for(KeyboardMotionFingerMap.TAB tab: fingerMap[LR_index].getTAB()){
338+ reportProgress(frame=tab.frame);
332339 if(pre_tab!=null){
333- for(;pre_tab.frame<tab.frame;pre_tab.frame++){
334- ps = player.getInterporate(pre_tab.frame);
340+ for(frame=pre_tab.frame+1;frame<tab.frame;frame++){
341+ ps = player.getInterporate(frame);
335342 playerModel.setPoses(ps);
336343 playerModel.resetChanged();
344+
345+ ps = motion.getInterporate(frame);
346+ keyModel.setPoses(ps);
337347 makeFinger(LR_index,
338348 pre_tab.onList,
339349 pre_tab.noteList,
340350 pre_tab.velocity);
341351 ps = playerModel.getChanged();
342- player.putAll(ps, pre_tab.frame);
352+ player.putAll(ps, frame);
343353 }
354+ for(Bone b:iksArm[LR_index].getBones()){
355+ BonePose bp=b.getPose();
356+ bp.frame=frame-1;
357+ player.put(bp);
358+ }
344359 }
345360 ps = player.getInterporate(tab.frame);
346361 playerModel.setPoses(ps);
@@ -350,9 +365,9 @@
350365 if(makeFinger(LR_index,
351366 tab.onList,
352367 tab.noteList,
353- tab.velocity)){
368+ tab.velocity)){// on
354369 pre_tab=tab;
355- }else {
370+ } else { // off
356371 pre_tab=null;
357372 }
358373 ps = playerModel.getChanged();
@@ -523,7 +538,7 @@
523538 * @param LR_index 0: left 1: right
524539 * @param on 0: thumb, 1: direct, 3: ring, 4:small
525540 * @param note_num the same with on
526- * @return at least one finger is on a key, return true.
541+ * @return 最低でも1つは指が鍵に乗っているなら, {@code true}.
527542 */
528543 private boolean makeFinger(int LR_index,boolean [] on,int [] note_num,int velo){
529544 Vector3D finger,lz;
@@ -540,10 +555,13 @@
540555 Matrix keys_matrix=key60.getGMatrix();
541556 Vector3D key_x=keys_matrix.getLx();
542557 Bone wrist=playerModel.get(PartName.makeArm(LR_index,0));
543- double parityZ=(key_x.times(wrist.getLz())>0)?1D:-1D;// 消すな
558+ double parityZ=(key_x.times(wrist.getLz())>0)?1D:-1D;// 重要: 消すな
544559 double parity=(LR_index>0 ^ parityZ>0)?1D:-1D;// y回転に必要
545560 int leadFinger=-1;
546561
562+ /** 手を広げた体勢 */
563+ playerModel.setPoses(fingerStanby[LR_index]);
564+
547565 /* 手首をキーに垂直に */
548566 wrist.rotateToG(new Matrix(
549567 keys_matrix.getLz().rotate_vector(
@@ -553,9 +571,6 @@
553571 key_x.times(parityZ)
554572 ));
555573
556- /** 手を広げた体勢 */
557- playerModel.setPoses(fingerStanby[LR_index]);
558-
559574 /* lead finger 探し */
560575 for(int j:leadOrder){
561576 if(on[j]){
@@ -587,48 +602,44 @@
587602 /* リードフィンガーに対して手首を動かす. */
588603 Vector3D v=getVector(note_num[leadFinger], on[leadFinger]?0:1.0D * velo / 100);
589604 if(v!=null){
590- finger=playerModel.get(PartName.makeArm(LR_index,0)).getPos()
605+ finger=iks.getBones()[0].getPos()
591606 .sub(finger4[LR_index][leadFinger].getPos());
592607 iks.solve(v.add(finger));
593- for(Bone b:iks.getBones()){
594- b.setChanged();
595- }
596608 }
597609
598610 /* 残りの指をIK で片付ける*/
599- int prenum=-1;
600611 for(int j=1;j<5;j++){
601612 if(j==leadFinger)continue;
602- if(note_num[j]>=prenum){
603- prenum=note_num[j];
604- v=getVector(note_num[j], 0);
605- if(v==null)continue;
606- IKSolver ikf = new IKSolver();
607- Bone [] bs;
608- if(on[j]){
609- bs=new Bone[]{
610- finger4[LR_index][j],finger3[LR_index][j],
611- finger2[LR_index][j],finger1[LR_index][j]};
613+ if(note_num[j]<0)continue; // IK 不要の状態
614+ v=getVector(note_num[j], 0);
615+ if(v==null)continue;
616+ IKSolver ikf = new IKSolver();
617+ Bone [] bs;
618+ if(on[j]){
619+ // 付け根は始めにz 軸少しだけ曲げておく.
620+ lz=finger1[LR_index][j].getLz();
621+ angle=10D*parityZ*Math.PI/180D;
622+ finger1[LR_index][j].rotate(lz.times(Math.sin(angle)),Math.cos(angle));
612623
613- lz=finger1[LR_index][j].getLz();
614- angle=10D*parityZ*Math.PI/180D;
615- finger1[LR_index][j].rotate(lz.times(Math.sin(angle)),Math.cos(angle));
624+ bs=new Bone[]{
625+ finger4[LR_index][j],finger3[LR_index][j],
626+ finger2[LR_index][j],finger1[LR_index][j]};
616627
617- ikf.setBones(bs);
618- ikf.setLimits(1, IKSolver.RLIMIT_NOX|IKSolver.RLIMIT_NOY);
619- ikf.setLimits(2, IKSolver.RLIMIT_NOX|IKSolver.RLIMIT_NOY);
620- ikf.setLimits(3, IKSolver.RLIMIT_NOX|IKSolver.RLIMIT_NOZ);
621- for(Bone b: bs){
622- b.setChanged();
623- }
624- } else {
625- ikf.setBones(new Bone[]{finger4[LR_index][j],finger1[LR_index][j]});
626- ikf.setLimits(1, IKSolver.RLIMIT_NOX|IKSolver.RLIMIT_NOZ);
627- }
628- ikf.solve(v);
628+ ikf.setBones(bs);
629+ ikf.setLimits(1, IKSolver.RLIMIT_ONLY_Z);
630+ ikf.setLimits(2, IKSolver.RLIMIT_ONLY_Z);
631+ ikf.setLimits(3, IKSolver.RLIMIT_ONLY_Y);
632+ } else { // off: z方向には曲げない
633+ bs=new Bone[]{finger4[LR_index][j],finger1[LR_index][j]};
634+ ikf.setBones(bs);
635+ ikf.setLimits(1, IKSolver.RLIMIT_ONLY_Y);
629636 }
637+ ikf.solve(v);
638+ for(Bone b: bs){
639+ b.setChanged();
640+ }
630641 }
631- if(note_num[4]<note_num[3]){
642+ if(note_num[4]<0 && note_num[3]>=0){ // 小指がフリーで薬指が IK の状態では小指を外に向ける.
632643 lz=finger1[LR_index][4].getLy();
633644 angle=20D*parity*Math.PI/180D;
634645 finger1[LR_index][4].rotate(lz.times(Math.sin(angle)),Math.cos(angle));
@@ -714,7 +725,7 @@
714725 } else { // 指0 が無いとき
715726 double length_unit=key_unit.norm();
716727
717- i=1;
728+ i=1;// 人差し指
718729 Vector3D diff=finger1[LR_index][i].getPos().sub(finger1[LR_index][2].getPos());
719730 double temp_length=diff.times(finger1[LR_index][i].getGMatrix().getLz());
720731 if(temp_length>0){
@@ -726,7 +737,7 @@
726737 finger1[LR_index][2].getMatrix().getLz().times(temp_length)
727738 );
728739
729- for(i=3;i<5;i++){
740+ for(i=3;i<5;i++){// 薬指・小指
730741 diff=finger1[LR_index][i].getPos().sub(finger1[LR_index][2].getPos());
731742 temp_length=diff.times(finger1[LR_index][i].getGMatrix().getLz());
732743 if(temp_length>0){
@@ -737,7 +748,7 @@
737748 finger1[LR_index][i].translationTo(finger1[LR_index][2].getMatrix().getLz().times(temp_length));
738749 }
739750
740- for(i=1;i<5;i++){
751+ for(i=1;i<5;i++){// ちょっとだけy軸に外側に曲げる.
741752 ly=finger1[LR_index][i].getGMatrix().getLy();
742753 radian=parity*Math.PI*(8D*(i-2))/180D;
743754 finger1[LR_index][i].rotate(ly.times(Math.sin(radian)), Math.cos(radian));
--- MID2Motion/trunk/MID2Motion-plugin/pom.xml (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/pom.xml (revision 66)
@@ -72,12 +72,12 @@
7272 <dependency>
7373 <groupId>jp.sourceforge.mmd</groupId>
7474 <artifactId>MMDMotion</artifactId>
75- <version>1.5</version>
75+ <version>1.5.1</version>
7676 </dependency>
7777 <dependency>
7878 <groupId>jp.sourceforge.mmd</groupId>
7979 <artifactId>MID2Motion</artifactId>
80- <version>1.2</version>
80+ <version>1.2.1</version>
8181 </dependency>
8282 </dependencies>
8383 </project>
--- MID2Motion/trunk/MID2Motion-plugin/README.txt (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/README.txt (revision 66)
@@ -15,7 +15,7 @@
1515 5. OpenOffice calc などCSV(Shift JIS)が扱えるソフトウェア
1616
1717 = 何これ =
18-MID2Motion のモーションビルダープラグインです。
18+MID2Motion のモーションビルダープラグインの開発パッケージです。
1919 Standard MIDIは、General MIDI でもある程度対応しますが、基本的には
2020 MAGIX Music Maker および Samplitude 用の MIDI を想定します。
2121
@@ -50,9 +50,10 @@
5050 Version 1.6 以降ならなんでも動くと思います。(IBM製では、swing を別に
5151 インストールする必要があります。)
5252 2. MID2Motion が必要です。できるだけ最新バージョンを用意してください。
53- 3. Maven のリポジトリーにMID2Motion の全jar を登録します。
53+ 3. Maven のローカルリポジトリーにMID2Motion の全jar を登録
54+ (mvn install) します。
5455
55-= コンパイル =
56+= コンパイル法 =
5657 wiki の方が詳しいので、できれば見といてください。
5758 http://mmdmotion-java.osdn.jp/wiki/MID2Motion
5859
@@ -66,7 +67,7 @@
6667 4. src/assembly/*.xml を書きます。
6768 5. pom.xml の assembly.plugin を書き換えてあなたのplugin パッケージの
6869 assembly/*.xml を指定します。
69- 6. このディレクトリーをカレントにして、mvn compile
70+ 6. pom.xmlがあるディレクトリーをカレントにして、mvn compile
7071 7. mvn assembly でplugin パッケージ (*.zip)が target 以下にできます。
7172 8. zipの中身を確認して、MID2Motion のpluginに加えてください。
7273
--- MID2Motion/trunk/MID2Motion-plugin/template/sampler/keysPlayer.table.csv (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/template/sampler/keysPlayer.table.csv (revision 66)
@@ -3,9 +3,9 @@
33 ;!Template,keysPlayer.sample.vmd,,,,,,
44 ;name,note num,from,hit,length,extend type(1/0),note off start frame(0 means no note off),note off end
55 スタンバイ,0,0,0,1,0,0,0
6-前後,48,1,4,4,0,4,7
7-腰振り,49,10,10,17,1,0,0
8-左足ふみ,50,27,30,4,0,30,33
9-右足ふみ,51,36,39,4,0,39,42
10-左手上げ,52,43,46,4,0,46,49
11-右手上げ,53,50,53,4,0,53,56
6+前屈,62,1,4,4,0,4,7
7+腰振り,64,10,10,17,1,0,0
8+左足上げ,17,27,30,4,0,30,33
9+右足上げ,16,36,39,4,0,39,42
10+左手上げ,72,43,46,4,0,46,49
11+右手上げ,73,50,53,4,0,53,56
--- MID2Motion/trunk/MID2Motion-plugin/template/sampler/commonTable.csv (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/template/sampler/commonTable.csv (revision 66)
@@ -2,16 +2,28 @@
22 ; MID2Motion Ver. 1.2 標準,,,,,,,
33 ;!Template,common.temp.vmd,,,,,,
44 ;name,note num,from,hit,length,extend type(1/0),note off start frame(0 means no note off),note off end
5-腰振り,47,165,165,13,1,0,0
6-サイドステップ,48,5,5,26,1,0,0
7-首たて,49,35,35,6,1,0,0
8-首横,50,41,41,13,1,0,0
9-足踏み,51,55,59,7,0,0,0
10-ドロップ,52,65,67,8,0,0,0
11-ツイスト,53,75,75,13,1,0,0
12-ジャンプ,54,90,93,16,0,0,0
13-前屈,55,110,113,4,0,113,116
14-横屈,56,120,120,13,1,0,0
15-のけぞり,57,135,140,6,0,140,145
16-左手を見る,58,148,150,3,0,151,153
17-右手を見る,59,155,157,3,0,158,160
5+スタンバイ,0,0,0,1,0,0,0
6+basic style,1,1,1,1,0,0,0
7+基本 to stand,2,180,185,6,0,0,0
8+stand to 基本,3,199,204,6,0,0,0
9+サイドステップ,12,5,5,26,1,0,0
10+足踏み(左小),13,55,59,7,0,0,0
11+ドロップ,14,65,67,8,0,0,0
12+ジャンプ,15,90,93,16,0,0,0
13+右足上げ(stand),16,186,189,4,0,189,192
14+左足上げ(stand),17,192,195,4,0,195,198
15+ツイスト(往復),60,75,75,13,1,0,0
16+横屈往復,61,120,120,13,1,0,0
17+前屈,62,110,113,4,0,113,116
18+のけぞり,63,135,140,6,0,140,145
19+腰振り(往復),64,165,165,13,1,0,0
20+右手上げ,72,206,206,1,0,0,0
21+左手下げ,73,210,210,1,0,0,0
22+右手右,74,207,207,1,0,0,0
23+右手前,75,208,208,1,0,0,0
24+首たて振り,108,35,35,6,1,0,0
25+首横振り,109,41,41,13,1,0,0
26+左手を見る,110,148,150,3,0,151,153
27+下を見る,111,155,157,3,0,158,160
28+左を見る,112,219,221,1,0,221,223
29+右を見る,113,215,217,1,0,217,219
--- MID2Motion/trunk/MID2Motion-plugin/template/sampler/kino_maki.table.csv (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/template/sampler/kino_maki.table.csv (revision 66)
@@ -1,9 +1,15 @@
1-; sample motion builder file,きの式弦巻マキ,はむすタン,用,,,,
1+; sample motion builder file,きの式弦巻マキ,覇むすタン,用,,,,
22 ; MID2Motion Ver. 1.2 標準,,,,,,,
3+; 使い方:
4+; このテンプレートは換算表1つに対して、モーションテンプレートが2つあります。
5+; 覇むすタンのセンターを弦巻マキの上半身に接続して使います。
6+; あんまり手の位置があってないのは、p-guitar や v-guitar 用の前準備用だからです。
7+; テンプレートは下の行の2つです。
38 ;!Template,kino_maki-hamustan.sample.vmd,hamustan-kino_maki.sample.vmd,,,,,
49 ;name,note num,from,hit,length,extend type(1/0),note off start frame(0 means no note off),note off end
510 立つ,0,0,0,1,0,0,0
611 スタンバイ,1,5,5,1,0,0,0
12+; ここから下4つは PowerGuitarMotionBuilder (p-guitar) ができるまでの臨時だったので今は使われない。,,,,,,,
713 ダウンスイング,128,20,21,4,0,0,0
814 アップスイング,129,24,25,4,0,0,0
915 ブリッジミュートダウン,130,10,11,4,0,0,0
@@ -24,21 +30,21 @@
2430 E2(power),52,31,31,1,0,31,31
2531 F2(power),53,30,30,1,0,30,30
2632 ;,,,,,,,
27-6th down swing,60,50,51,2,0,0,0
28-5th down swing,61,52,53,2,0,0,0
29-4th down swing,62,54,55,2,0,0,0
30-3rd down swing,63,56,57,2,0,0,0
31-2nd down swing,64,58,59,2,0,0,0
32-1st down swing,65,60,61,2,0,0,0
33+6th down swing,84,50,51,2,0,0,0
34+5th down swing,85,52,53,2,0,0,0
35+4th down swing,86,54,55,2,0,0,0
36+3rd down swing,87,56,57,2,0,0,0
37+2nd down swing,88,58,59,2,0,0,0
38+1st down swing,89,60,61,2,0,0,0
3339 ;,,,,,,,
34-under form start,72,80,85,6,0,0,0
35-under form return,73,85,90,6,0,0,0
36-van halen start,74,90,95,6,0,0,0
37-van halen return,75,95,100,6,0,0,0
38-stand style,76,100,105,6,0,0,0
39-stand style return,77,130,135,6,0,0,0
40+under form start,4,80,85,6,0,0,0
41+under form return,5,85,90,6,0,0,0
42+van halen start,6,90,95,6,0,0,0
43+van halen return,7,95,100,6,0,0,0
44+基本 to stand,2,100,105,6,0,0,0
45+stand to 基本,3,130,135,6,0,0,0
4046 ;,,,,,,,
41-right foot step,80,105,108,4,1,108,111
42-left foot step,81,111,114,4,1,114,117
43-guitar swing holizontal,82,118,121,4,1,121,124
44-guitar swing vertical,83,124,127,4,1,127,130
47+右足上げ(stand),16,105,108,4,1,108,111
48+左足上げ(stand),17,111,114,4,1,114,117
49+guitar swing holizontal,65,118,121,4,1,121,124
50+guitar swing vertical,66,124,127,4,1,127,130
--- MID2Motion/trunk/MID2Motion-plugin/template/bass/kanaBassTable.csv (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/template/bass/kanaBassTable.csv (revision 66)
@@ -1,7 +1,16 @@
1-;Shift-JIS Japanese,,,,
2-;,,,,
3-;天音カナベース付き用テンプレート,,,,
4-; kadotanimitsuru さんの kanabass 互換です.,,,,
1+;Shift-JIS Japanese
2+;distributed under public domain
3+;
4+;MID2Motion BassMotionBuilder 天音カナベース付き用テンプレート
5+; kadotanimitsuru さんの kanabass 互換です。
6+; ピッキングベース兼用です。
7+; ピッキングベースにするときは、テンプレートを kanaPicBass.temp.vmd に合わせてください。
8+; ピックは、すわとうさんの「ギターピック10枚セット」を使ってますが、今は配布されていない
9+; ようなので、手に入らないときは「覇むすタン」のおまけ(jamBAND ピック)を使ってみてください。
10+; 右人指2の(x,y,z,Rx,Ry,Rz,T,S)=(-0.07,0,-0.09,30,80,-90,1,1)に接続.
11+;
12+;!Template,kanaBass.temp.vmd,kanaPicBass.temp.vmd
13+;
514 ;text,note num,on/1st,off/2nd,string
615 stanby,0,10,0,0
716 E1,40,0,0,4
--- MID2Motion/trunk/MID2Motion-plugin/template/drums/rizumu-hoshinotamaTable.csv (revision 65)
+++ MID2Motion/trunk/MID2Motion-plugin/template/drums/rizumu-hoshinotamaTable.csv (revision 66)
@@ -1,5 +1,7 @@
11 ;midi2drum (SJIS),,,,,,,,,,
2-;モーションマップファイル,,,,,,,,,,
2+;drum モーション換算表,,,,,,,,,,
3+;!Template,rizumu-hoshinotama.temp.vmd,hoshinotama-rizumu.temp.vmd,,,,,,,,
4+;,,,,,,,,,,
35 ;name,from,hit,player,drum,note_num,pre_hh_open,after_hh,left,right,body
46 ready,0,0,1,0,0,1,1,0,0,0
57 standby,5,5,1,0,256,1,1,0,0,0
@@ -6,15 +8,19 @@
68 bass,8,10,6,7,36,0,0,0,0,n
79 snare,18,20,6,0,38,0,0,1,0,0
810 open hi,28,30,6,8,46,1,1,0,1,0
9-22 raid,38,40,6,23,51,0,0,1,0,0
10-7 tamL,63,65,6,0,50,0,0,1,0,5.7
11-7 tamR,73,75,6,0,48,0,0,1,0,5.7
12-17 crash (crash 1),83,85,6,21,49,0,0,0,1,0
13-8 tamR,93,95,6,0,47,0,0,0,1,-23.5
14-8 tamL,103,105,6,0,45,0,0,1,0,-23.5
15-Floor tam R,113,115,6,0,43,0,0,1,0,-43.5
16-Floor tam L,123,125,6,0,41,0,0,0,1,-43.5
11+22 raid,38,40,6,23,51,0,0,0,1,0
12+7 tamL,61,63,6,0,48,0,0,1,0,5.7
13+7 tamR,67,69,6,0,50,0,0,0,1,5.7
14+7 tamL(0),73,75,6,0,48,0,0,-1,0,0
15+17 crash (crash 1),83,85,6,21,49,0,0,1,0,0
16+8 tamR,89,91,6,0,47,0,0,0,1,-23.5
17+8 tamL,95,97,6,0,45,0,0,1,0,-23.5
18+8 tamR(0),101,103,6,0,47,0,0,0,-1,0
19+17 crash (crash 1)R,107,109,6,21,49,0,0,0,1,0
20+Floor tam R,113,115,6,0,43,0,0,0,1,-43.5
21+Floor tam L,123,125,6,0,41,0,0,1,0,-43.5
1722 Chinese,133,135,6,16,52,0,0,0,1,-43.5
23+Floor tam R(0),143,145,6,0,43,0,0,0,-1,0
1824 stick,153,155,6,0,37,0,0,1,1,n
1925 open,164,164,1,1,258,-1,1,0,0,n
2026 close,165,165,1,1,257,1,-1,0,0,n
@@ -24,3 +30,10 @@
2430 clap,193,195,8,0,39,0,0,1,0,0
2531 close hit,203,205,6,6,42,-1,-1,0,1,0
2632 15 crash (crash 2),213,215,6,16,57,0,0,0,1,0
33+7 tamL(-23.5),220,222,6,0,48,0,0,-1,0,-23.5
34+8 tamR(5.7),226,228,6,0,47,0,0,0,-1,5.7
35+ride bell,233,235,6,13,53,0,0,0,1,0
36+8 tamL(-43.5),243,245,6,0,45,0,0,-1,0,-43.5
37+Floor tam R(-23.5),253,255,6,0,43,0,0,0,-1,-23.5
38+stick rotation L,260,260,15,0,2,0,0,1,0,n
39+stick rotation R,275,275,15,0,3,0,0,0,1,n
Show on old repository browser