• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Windows Apps


Commit MetaInfo

Revision69d230b08e1f13b450a98c0a5e2a3972aa5e382c (tree)
Zeit2014-07-06 19:53:24
Autoroga <oga@mxg....>
Commiteroga

Log Message

V1.04-18 support specify midifile argument
V0.50-16 fix 0xff data length prob.

Ändern Zusammenfassung

Diff

Binary files a/wkeyboard/Release/wkeyboard.exe and b/wkeyboard/Release/wkeyboard.exe differ
--- a/wkeyboard/ToDo.txt
+++ b/wkeyboard/ToDo.txt
@@ -33,4 +33,6 @@ ToDo
3333 #Tempoが効かないことがある件調査(Exメッセージ処理不正対策で解決?)
3434 (8)キーボード和音押し表示対応 V1.04-16
3535 (9)midiファイルを引数で再生できるようにする。 V1.04-18
36+(10)Hoedown.midで無限ループする (ff03の文字列長の複数バイト処理不足) V0.50-16
37+
3638
--- a/wkeyboard/midilib.c
+++ b/wkeyboard/midilib.c
@@ -800,11 +800,16 @@ int len;
800800 * ffxxLLDDDDDDD...
801801 */
802802 cmd1 = buf[pt]; /* 0xff */
803- cmd2 = buf[pt+1]; /* sub command */
803+ cmd2 = buf[pt+1]; /* sub command */
804804 nlen = buf[pt+2]; /* command len */
805- pt += 3; /* skip ffxxLL */
805+ pt += 3; /* skip ffxxLL */
806+
807+ nlen = GetDeltaTime(&buf[pt-1], codebuf, &size); /* get strlen V0.20-A V0.50-16-A */
808+ pt += (size-1); /* skip ffxx<LL..> V0.20-A V0.50-16-A */
809+
810+ strcpy(&codebuf[strlen(codebuf)-1], " :"); /* V0.20-A V0.50-16-A */
811+ printf("%02x %02x %s ", cmd1, cmd2, codebuf); /* V0.15-C V0.20-C V0.50-16-A */
806812
807- printf("%02x %02x %02x : ",cmd1,cmd2,nlen); /* V0.15-C */
808813 switch (cmd2) {
809814 case 0x00: /* ff00 02 ssss Sequence Number V0.16-A */
810815 /* シーケンス番号(format 2 only) len:2 */
@@ -844,16 +849,16 @@ int len;
844849 * ("Introduction" とか "A", "B" など)
845850 */
846851 printf("SUB(06):Marker : ");
847- PutTextData(&buf[pt], nlen);
848- break;
852+ PutTextData(&buf[pt], nlen);
853+ break;
849854 case 0x07: /* ff07 Queue Point */
850855 /* キューポイント: 曲データ中、このメタイベントの
851856 * 挿入されている位置で、 その曲以外の進行を記述する
852857 * のに用いる。 (曲中の進行の記述には、マーカーを用いる)
853858 */
854859 printf("SUB(07):Queue Point : ");
855- PutTextData(&buf[pt], nlen);
856- break;
860+ PutTextData(&buf[pt], nlen);
861+ break;
857862 case 0x20: /* ff20 01 cc MIDI channel prefix V0.16-A */
858863 /* MIDIチャンネルプリフィックス(len:1) */
859864 val = buf[pt]; /* prefix */
@@ -1235,6 +1240,10 @@ int trknm;
12351240 cmd2 = buf[pt+1]; /* sub command */
12361241 nlen = buf[pt+2]; /* command len */
12371242 pt += 3; /* skip ffxxLL */
1243+
1244+ nlen = GetDeltaTime(&buf[pt-1], codebuf, &size); /* get strlen V0.20-A V0.50-16-A */
1245+ pt += (size-1); /* skip ffxx<LL..> V0.20-A V0.50-16-A */
1246+
12381247 switch(cmd2) {
12391248 case 0x51: /* ff51 03 tttttt Set Tempo */
12401249 tempo = buf[pt]*256*256 + buf[pt+1]*256 + buf[pt+2]; /* tempo */
--- a/wkeyboard/wkeyboard.clw
+++ b/wkeyboard/wkeyboard.clw
@@ -13,11 +13,11 @@ Class2=CWkeyboardDlg
1313 Class3=CAboutDlg
1414
1515 ResourceCount=4
16-Resource1=IDD_SELINST_DLG
16+Resource1=IDD_ABOUTBOX
1717 Resource2=IDR_MAINFRAME
18-Resource3=IDD_ABOUTBOX
18+Resource3=IDD_WKEYBOARD_DIALOG
1919 Class4=CSelectInst
20-Resource4=IDD_WKEYBOARD_DIALOG
20+Resource4=IDD_SELINST_DLG
2121
2222 [CLS:CWkeyboardApp]
2323 Type=0
--- a/wkeyboard/wkeyboardDlg.cpp
+++ b/wkeyboard/wkeyboardDlg.cpp
@@ -530,6 +530,16 @@ BOOL CWkeyboardDlg::OnInitDialog()
530530
531531 ClearPushRect2();
532532 // V1.04-A end
533+
534+ // 引数取得 V1.04-18-A start
535+ char wk[4096];
536+ GetArg(GetCommandLine(), wk, 2);
537+ if (strlen(wk)) {
538+ // ファイル指定あり
539+ strcpy(mFname, wk);
540+ ReadMidiFile();
541+ }
542+ // V1.04-18-A end
533543
534544 // oga end
535545
@@ -1828,13 +1838,32 @@ void CWkeyboardDlg::OnTimer(UINT nIDEvent)
18281838 }
18291839
18301840 // V1.04-A start
1841+// V1.04-18-A start
1842+void CWkeyboardDlg::ReadMidiFile()
1843+{
1844+ char work[4096];
1845+
1846+ // MIDIデータ読込み
1847+ if (MidiRead(mFname) == 0) {
1848+ // 再生ボタン有効
1849+ SetPlayButtons(TRUE);
1850+
1851+ // タイトルバーにファイル名表示
1852+ sprintf(work, "wkeyboard - %s", mFname);
1853+ SetWindowText(work);
1854+ }
1855+
1856+ // 自動再生
1857+ OnBtnPlay();
1858+}
1859+// V1.04-18-A end
1860+
18311861 void CWkeyboardDlg::OnDropFiles( HDROP hDropInfo )
18321862 {
18331863 // Drag & Drop時の処理
18341864 int i;
18351865 int size;
18361866 int nfiles = 0;
1837- char work[4096];
18381867
18391868 SetWindowText("wkeyboard");
18401869
@@ -1848,16 +1877,7 @@ void CWkeyboardDlg::OnDropFiles( HDROP hDropInfo )
18481877 /* fnameにそれぞれのドラッグされたファイルが入る(複数あった場合最後だけ有効) */
18491878 }
18501879
1851- // MIDIデータ読込み
1852- if (MidiRead(mFname) == 0) {
1853- // 再生ボタン有効
1854- SetPlayButtons(TRUE);
1855-
1856- // タイトルバーにファイル名表示
1857- sprintf(work, "wkeyboard - %s", mFname);
1858- SetWindowText(work);
1859- }
1860-
1880+ ReadMidiFile(); // V1.04-18-C
18611881 }
18621882
18631883 // SetPlayButtons()
@@ -1995,4 +2015,46 @@ void CWkeyboardDlg::OnBtnSelinst()
19952015 dlg.DoModal();
19962016 }
19972017
2018+
2019+// V1.04-18-A start
2020+//
2021+// Get Argument from Command Line
2022+//
2023+
2024+void CWkeyboardDlg::GetArg(char *line, char *arg, int pos)
2025+{
2026+ char *pt = line;
2027+ int i, j;
2028+
2029+ arg[0] = '\0';
2030+
2031+ for (i = 0; i<pos; i++) {
2032+ j = 0;
2033+ if (*pt == '"') {
2034+ ++pt;
2035+ while(*pt != '"' && *pt != '\0') {
2036+ arg[j++] = *pt;
2037+ ++pt;
2038+ }
2039+ arg[j] = '\0';
2040+ ++pt;
2041+ } else {
2042+ while(*pt != ' ' && *pt != '\0') {
2043+ arg[j++] = *pt;
2044+ ++pt;
2045+ }
2046+ arg[j] = '\0';
2047+ }
2048+ while (*pt == ' ') ++pt; // skip arg sep.
2049+ if (*pt == '\0') {
2050+ break;
2051+ }
2052+ }
2053+ //MessageBox(arg);
2054+ if (i != pos-1) {
2055+ arg[0] = '\0'; // no arg for pos
2056+ }
2057+}
2058+// V1.04-18-A end
2059+
19982060 // V1.04-A end
--- a/wkeyboard/wkeyboardDlg.h
+++ b/wkeyboard/wkeyboardDlg.h
@@ -103,25 +103,27 @@ protected:
103103 char mFname[2048]; // MIDIファイル名 V1.04-A
104104 int mposx[GT_NFRET+1]; // ギターフレットの位置 V1.04-13-A
105105
106- void DrawKeyBoard(CDC *pDC);
107- void DrawGuitar(CDC *pDC); // V1.01-A
108- void DrawLine(CDC *pDC, int x1, int y1, int x2, int y2, int abs);
109- void WinMidiShortMsg(MidiInst *pminst, DWORD dwMsg);
110- void WinMidiClose(MidiInst *pminst);
111- void WinMidiOpen(MidiInst *pminst);
112- void CALLBACK WinMidiOutCB(HMIDIOUT hmo, UINT wMsg, DWORD dwinst, DWORD param1, DWORD param2);
113- int GetToneNo(CPoint point, int push); // V1.04-C
114- int GetToneNoFromKey(UINT nChar, int push); // V1.04-C
115- int GetRectFromTone(int tone, int ch, CRect *pRect, int *pWhite); // V1.04-C
116- void DelRectFromTone(int tone); // for mPushRect2 V1.04-A
117- int GetMilliSec(); // V1.03-A
118- void CalcTempo(); // V1.03-A
119- BOOL PreTranslateMessage(MSG* pMsg); // キーの事前補足
120- void ClearPushRect2(); // V1.04-A
121- void CWkeyboardDlg::SetPlayButtons(BOOL sw); // V1.04-A
122-
123- // Cの関数ポインタ代入のため、ヘッダ側でsttic定義
124- static void MidiCallback(unsigned int cmd); // V1.04-A
106+ void DrawKeyBoard(CDC *pDC);
107+ void DrawGuitar(CDC *pDC); // V1.01-A
108+ void DrawLine(CDC *pDC, int x1, int y1, int x2, int y2, int abs);
109+ void WinMidiShortMsg(MidiInst *pminst, DWORD dwMsg);
110+ void WinMidiClose(MidiInst *pminst);
111+ void WinMidiOpen(MidiInst *pminst);
112+ void CALLBACK WinMidiOutCB(HMIDIOUT hmo, UINT wMsg, DWORD dwinst, DWORD param1, DWORD param2);
113+ int GetToneNo(CPoint point, int push); // V1.04-C
114+ int GetToneNoFromKey(UINT nChar, int push); // V1.04-C
115+ int GetRectFromTone(int tone, int ch, CRect *pRect, int *pWhite); // V1.04-C
116+ void DelRectFromTone(int tone); // for mPushRect2 V1.04-A
117+ int GetMilliSec(); // V1.03-A
118+ void CalcTempo(); // V1.03-A
119+ BOOL PreTranslateMessage(MSG* pMsg); // キーの事前補足
120+ void ClearPushRect2(); // V1.04-A
121+ void SetPlayButtons(BOOL sw); // V1.04-A
122+ void GetArg(char *line, char *arg, int pos); // V1.04-18-A
123+ void ReadMidiFile(); // V1.04-18-A
124+
125+ // Cの関数ポインタ代入のため、ヘッダ側でstatic定義
126+ static void MidiCallback(unsigned int cmd); // V1.04-A
125127
126128
127129 // 生成されたメッセージ マップ関数