マイコン NADESIKO マガジン
日本語プログラム言語「なでしこ」の解説サイト
ホンキ・ホンネ
| 目次 |
|---|
「ホンキでNadesikoホンネでZakki !!」について
日本語プログラム言語「なでしこ」に関することやTips等、他のコーナーでは扱っていない解説や雑記をまとめています。
コーナー名は、昔のパソコン雑誌「マイコンBASICマガジン」のコーナー「ホンキでPlayホンネでReview!!」から。
カテゴリー
最近の記事
- 001. ホンキ・ホンネ/Tips/MIDIをDirectMusicで再生
- 002. ホンキ・ホンネ/Tips/WinAPIでビープ音に音階をつける
- 003. ホンキ・ホンネ/Tips/WinAPIで警告音を鳴らす
- 004. ホンキ・ホンネ/Tips/ZIP内のファイルを削除する
- 005. ホンキ・ホンネ/プログラム/ボールの運動シミュレーション
ホンキ・ホンネ/Tips/MIDIをDirectMusicで再生
Category: Tips
"なでしこ"は、「再生」命令や「MCI」関連の命令を使ってMIDIファイルを扱うことができますが、今回は、それ以外の手段でMIDIを再生する方法を書きたいと思います。
「GuruGuruSMF」というMIDIを扱うための汎用DLLがあり、主に"C++"向けのものなのですが、"なでしこ"でも利用することが可能です。
"GuruGuruSMF"は"DirectMusic"によるMIDI再生ができるため、このDLLを利用することで"なでしこ"でもDirectMusicでMIDI再生ができるようになるということになります。
ということで、必要最低限の内容ですが、"なでしこ"で"GuruGuruSMF"を利用したMIDI再生のサンプルを紹介します。
ちなみに、このサンプルの作成に利用している"GuruGuruSMF"のバージョンは"ver.4.0.6"です。
// 「GuruGuruSMF」を"なでしこ"でつかうサンプル
# DLL設定
●オープンデバイス(deviceID, handle) = DLL("GuruGuruSMF4.dll", "BOOL GGS4OpenDevice(int, HWND)")
●クローズデバイス() = DLL("GuruGuruSMF4.dll", "void GGS4CloseDevice()")
●MIDIファイルオープン(fileName, option, musicId) = DLL("GuruGuruSMF4.dll", "BOOL GGS4AddListFromFileA(LPCSTR, int, int)")
●GGSプレイ(option, musicId, seek, fadeInTime, keyShift) = DLL("GuruGuruSMF4.dll", "BOOL GGS4Play(int, int, int, int, int)")
●GGSストップ(fadeOutTime) = DLL("GuruGuruSMF4.dll", "void GGS4Stop(int)")
# 母艦の設定
母艦の閉じた時は
GGSストップ(0)
クローズデバイス()
母艦の終了可能はオン
おわり
その終了可能はオフ
# GUI
再生ボタンとはボタン
そのクリックした時は
GGSプレイ(1, 1, 0, 0, "") // 再生方法・識別ID・シーク・フェードイン時間(ミリ秒: 最低値100)・半音単位で移調
停止ボタンとはボタン
そのクリックした時は
GGSストップ(0) // フェードアウト時間(ミリ秒: 最低値100)
# 実行
オープンデバイス(-1100, 母艦のハンドル) // MIDIデバイスを開く DirectMusic: -1100 / MIDI_MAPPER: -1
MIDIファイルオープン(母艦パス&"sample.mid", 0, 1) // MIDIファイルを開く ファイル名・ロードオプション・識別ID
サンプルのソースを適当なフォルダに保存して、同じフォルダ内に"GuruGuruSMF4.dll"と"sample.mid"というMIDIファイルを置いてから実行してください。
各命令の利用法や引数については、"GuruGuruSMF"に付属するヘルプファイルに詳しく書かれているので、そちらを参考にしてください。
MCIでMIDIファイルを扱う場合、パソコンのOS環境によってはファイルを開いた時や再生開始時にプログラムが固まるときがありますが、"GuruGuruSMF"を利用することで、それらを回避することができます。
また、ツクールシリーズ向けMIDIのループ再生※1にも対応しているため、"なでしこ"でもツクールシリーズ独自のMIDIループ再生をさせることができるようになります。
参考リンク
- 「GuruGuruSMF」の配布元
- http://gurugurusmf.migmig.net/
ホンキ・ホンネ/Tips/WinAPIでビープ音に音階をつける
Category: Tips
前回の更新で"Win32API"を利用していろんなビープ音を鳴らす方法を書きましたが、今回もビープ関連のネタです。
前回、紹介したMessageBeep関数のほかに、まさにビープを鳴らすための関数"Beep"というものがあります。
この、Beep関数は単にビープ音を再生するだけでなく、音階や音の長さを設定できます。
// BEEPの音階や音の長さを変える
# DLL設定
●ビープ音階(dwFreq, dwDuration)=DLL("kernel32.dll", "BOOL Beep(DWORD, DWORD)")
# 実行
ビープ音階(440, 200)// ド
ビープ音階(494, 200)// レ
ビープ音階(554, 200)// ミ
ビープ音階(587, 200)// ファ
ビープ音階(659, 200)// ソ
ビープ音階(740, 200)// ラ
ビープ音階(830, 200)// シ
ビープ音階(880, 300)// ド
上記のサンプルを実行すると、ビープ音で"ドレミファソラシド"と再生されます。
引数"dwFreq"の部分が音の周波数で単位は"Hz(ヘルツ)"になります。
この値を調整することで、音階が変化します。
引数"dwDuration"の部分が音の長さで単位は"ms(ミリ秒)"になります。
この値を調整することで、ビープ音が再生される長さが変化します。
ただし、音階等の設定が行えるのはNT系のOSのみで9X系では設定が無視される※2そうです。
ホンキ・ホンネ/Tips/WinAPIで警告音を鳴らす
Category: Tips
OSやアプリケーションの操作をしていると、サウンドとともに警告メッセージ付きのダイアログが表示されることがあります。
この警告時に再生されるサウンドには「なでしこ」の命令"BEEP"でも再生できる、いわゆるビープ音の他にも、いくつかの音があります。
それらのアプリケーションなどでよく聞く警告音は、"Win32API"の"MessageBeep"関数を使って再生することができます。
ということで、今回はMessageBeep関数をなでしこで利用する方法を書きたいと思います。
// なでしこでMessageBeep関数を利用するサンプル
# DLL設定
●警告音(uType)=DLL("user32.dll","BOOL MessageBeep(UINT)")
# 実行
警告音(0)
上記のサンプルを実行すると、一般の警告音(標準的なビープ音)が再生されます。
サウンドは他にも設定可能で、サンプルのソースの場合は"警告音(0)"の"0"の数値を変えることで、他の警告音を再生できます。
指定できる警告音の値は以下のとおりです。
| 値 | 説明 |
|---|---|
| -1 |
SimpleBeep 標準的なビープ音。 |
| 0 |
MB_OK 一般の警告音。 なでしこの命令"BEEP"で再生される音は、これと同じになります。 |
| 16 |
MB_ICONHAND システムエラー。 |
| 32 |
MB_ICONQUESTION メッセージ(問合わせ)。 |
| 48 |
MB_ICONEXCLAMATION メッセージ(警告)。 |
| 64 |
MB_ICONASTERISK メッセージ(情報)。 |
再生される音は"サウンドとオーディオ デバイスのプロパティ"のサウンドの設定に準拠します。
そのため、サウンドタイプ(プログラム イベント)が設定されていないものを指定した場合には、音は再生されません。
なでしこで作ってプログラムにユーザーへ注意やメッセージをダイアログ表示する処理を組み込む場合には、ダイアログの表示とMessageBeep関数のサウンドを組み合わせるとよいでしょう。
ホンキ・ホンネ/Tips/ZIP内のファイルを削除する
Category: Tips
"なでしこ"には圧縮・解凍関連の機能も利用できますが、それらは統合アーカイバ・プロジェクトで配布されているDLLが利用されています。※3
そして、それらのDLLは単に圧縮・解凍だけでなく、圧縮ファイルに対して色々と高度な操作を行えます。
ということで、なでしこ同梱のDLLのなかから"7-zip32.dll"を利用してZIP圧縮されたファイル内から指定のファイルを削除する方法を書いてみたいと思います。
// ZIP内のThumbs.dbを削除するサンプル
PATH=「sample.zip」
「.zip」の「d "{PATH}" -r Thumbs.db」を圧縮解凍実行
サンプルでは、ZIPファイル"sample.zip"内にあるすべての"Thumbs.db"を削除します。
".zip"で、ZIPのアーカイブDLL("7-zip32.dll")を指定。
"d"が、削除コマンド。
"{PATH}"の部分が、検索の対象となるZIPファイルのパス。
"-r"が、再帰的ディレクトリの検索・・・つまり、ZIPファイル内に含まれる全フォルダを検索。
"Thumbs.db"の部分が、削除の対象となるファイル名、ファイル名はワイルドカードによる指定が可能です。
詳しいコマンドの説明については、配布されている"7-zip32.dll"に同梱されているテキストに書かれているので、そちらを参考にしてください。
ホンキ・ホンネ/プログラム/ボールの運動シミュレーション
Category: プログラム
まともな更新は約三年ぶりだなぁ・・・ということで、今回は"なでしこ"を使っての小ネタなプログラムソースの紹介です。
実は最近、8ビットパソコン全盛期の古いBASICプログラミングの解説書を引っ張り出して読んでいて、「ボールの運動シミュレーション」というプログラムを見つけました。
この手の解説のサンプルソースにはよくある、"速度"と"角度"を入力してボールの動きを再現するという内容のものです。
そこで、久しぶりのなでしこ解説ネタとして、そのソースを※4を基に"なでしこ"版を作ってみました。
// ボールの運動シミュレーション
母艦のスタイルはダイアログスタイル
その幅は260; その高さは226
そのクリックした時は~おわり
母艦を中央移動
ボールラベルとはラベル
その文字サイズは12; そのテキストは「○」; その可視はオフ
ボール移動タイマーとはタイマー
ボール移動タイマーについて
値は30
時満ちた時は
BX=BX+SX; SY=SY+0.1; BY=BY+SY
もしBY>=180ならば
SY=-ABS(SY)*0.8; BY=180
もしBX>=240ならば
SX=-ABS(SX)*0.8; BX=240
もしBX<=0ならば
SX=ABS(SY)*0.8; BX=0
もしBY<=0ならば
SY=ABS(SY)*0.8; BY=0
もしBY=180ならば
SX=SX*0.99
ボールラベルの位置は「{BX},{BY}」
速度=0; 角度=0
「ボールの速度は?」で尋ねる; 速度=INT(それ)
「ボールを発射する角度は?」で尋ねる; 角度=INT(それ)
BX=120; BY=90
ラジアン=-角度*3.141593/180
SX=速度*COS(ラジアン); SY=速度*SIN(ラジアン)
ボールラベルの位置は「{BX},{BY}」; その可視はオン
ボール移動タイマーの有効はオン
-
「ボールの運動シミュレーション」のプログラムソースをダウンロード
まず"ボールの速度"をたずねられるので、任意の数字を入力。
次に"ボールを発射する角度"をたずねられるので、同じく任意の数字を入力して"決定"ボタンを押すと、その数字に基づいてボールがウインドウの枠内を動きます。
ネットで検索すると他言語でも同系統のソースや解説なども見られるので、それらも参考にしてみてください。




