HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
0611
buhioドレミって音階出鳴らせますか?28解決


buhio

リンク

2023/6/11(Sun) 10:16:50|NO.99555

 みなさんコンニチワ。

 MIDIファイルは、ならせると思うのですが、例えば自分でドレミファソラシドを指定して鳴らすことってできるんでしょうか?
ピアノ音源とか、ドラム音源とかって必要なんですかね。

 調べたけどわからないんです。。タッチ画面もあるし、楽器みたいのは作れないかぁなどと妄想しています。
 よろしくおねがいします🐽



この記事に返信する


zrs90(5さい)

リンク

2023/6/11(Sun) 12:07:55|NO.99556

WindowsXP以降のPCなら
hsp3 同梱の、HSPMUCOM を使う事で
かなり昔のNECのパソコン PC-8801
のFM音源+α 相当の事が出来るようです

mml(※ミュージックマクロランゲージの略)
で制御すれば可能ではないかと
ただ、楽器の様に使えるかは分からないです

詳しくは、hspmucom.txt を参照して下さい


後、窓月らら さんが、音楽関係のモジュールか
ソフトを開発中のようです



zrs90(5さい)

リンク

2023/6/11(Sun) 12:32:38|NO.99557




youdai

リンク

2023/6/11(Sun) 18:14:21|NO.99558

自分ではまだ試していないのですが、以下のようなモジュールがあります。
ちょくとさんが配布しているモジュールで、MIDI出力を操作するモジュールがあります。

MIDI 出力 API モジュール midiapi for HSP3
https://chokuto.ifdef.jp/download/index.html

これを使えば、HSP3上でMIDI音源を直接操作することができると思います。



窓月らら

リンク

2023/6/12(Mon) 08:44:03|NO.99559

現状のHSP3でも mucom88 か MIDI が使えますが、
宣伝ですが私がそれを可能にするものを開発しています。
MI392DRV といいます。
波形メモリ音源とPCM音源を内蔵します。
HSPスクリプトエディタ上からMMLを書いて演奏できるようになります。
既に演奏できるところまではできてるのですが、100%完成しないと公開しないんで・・・
できるだけ今年中のリリースを考えてますが、進捗次第です。
ゲームプログラムに組み込みも可能になります。
目指しているのは、昔のゲーム機環境と同等のことをソフトウェアのみで実装することです。
演奏データはファミコン時代並に小さくできます。(1曲1KB以下とか)
効果音も当然これですべて処理できるようになります。wav mp3 ogg 不要になります。



窓月らら

リンク

2023/6/12(Mon) 08:56:39|NO.99560

あっ

>後、窓月らら さんが、音楽関係のモジュールか
>ソフトを開発中のようです

ありがとうございます♪ 開発中です。
mucom88 がバンドルされたときにやっとHSP3でもMMLができるようになったかー
と思って試したのですが、個人的に試した限りでは限界を感じたので
自分がほしいものは自分で作ることにしました。

開発中の演奏音声をそのうちYouTubeにアップ予定なので、そのときは宣伝しにきます。



buhio

リンク

2023/6/12(Mon) 10:31:02|NO.99562

みなさん、いつもありがとうございます。

意外と手法が少なく、難しいのですね、、

HSPMUCOM
midiapi for HSP3
MI392DRV(←期待して待ってます)

 どれから攻めるべきか。。。

 



窓月らら

リンク

2023/6/12(Mon) 10:53:42|NO.99563

ちなみに、MIDI でやる場合は「テキスト音楽サクラ」でMMLでSMFを出力できます。
現状のHSP3でもこれでSMFを出力してやって例えばcwsdrvを使って演奏とかはできるんです。
でもこれにはまずMIDI側の知識と制作環境が必要で、あまり効率がいいとは言えないんですよ。
なので、うちはHSP3だけで完結するのを開発しています。
(DirectSoundのI/F部分だけcwsdrvを利用させて頂いてます。)

MIDI手軽かもしれませんが、問題はユーザー環境での演奏を保証できないってところです。
音源によって変ってしまいますからね。
なので音源も内蔵してやれって方向になりました。

とりあえず、MI392DRV は KONAMI SCC(しってるかな?)以上の音が出せます。ステレオ対応。



usagi

リンク

2023/6/12(Mon) 16:49:49|NO.99567

>buhioさん
ハード音源等指定ではなく、デフォルトでよろしければ
Win98以降はMSGS音源がデフォで入っているので、
比較的簡単にプログラムから鳴らせますよ。

一例ですがどうぞ

;;おまじない始まり;; #module #uselib "winmm.dll" #func midiOutOpen "midiOutOpen" int, int, int, int, int #func midiOutClose "midiOutClose" int #func midiOutShortMsg "midiOutShortMsg" int, int #deffunc miopen midiOutOpen varptr(hmo), 0, 0, 0, 0 : return #deffunc miclose onexit if hmo != 0 { midiOutClose hmo } : return #deffunc mimsg int _msg midiOutShortMsg hmo, _msg : return #define global ctype pc(%1,%2) ($C0+%1) | (%2<<8) #define global ctype noteon(%1,%2,%3) ($90+%1) | (%2<<8) | (%3<<16) #define global ctype noteoff(%1,%2,%3) ($80+%1) | (%2<<8) | (%3<<16) #global ;;おまじない終わり;; ; 詳細はGMを参考 https://ja.wikipedia.org/wiki/General_MIDI ピアノ = 1; (0〜127) チェロ = 43 手拍子 = 39 音程 = 60; (0〜127) 音量 = 100; (0〜127) miopen mimsg pc(0, ピアノ) ; 音色選択 mimsg pc(1, チェロ) repeat mimsg noteon( 0, 音程, 音量) ;音符を鳴らす mimsg noteon( 1, 音程+4, 音量/2) wait 50 mimsg noteoff(0, 音程, 音量) ;音符を止める mimsg noteoff(1, 音程+4, 音量/2) mimsg noteon( 9, 手拍子, 音量); ドラム(9=10chはドラム) wait 50 loop



窓月らら

リンク

2023/6/12(Mon) 19:08:24|NO.99568

そうやね。ローランド製 MSGS
ピアノやギターはミックス素材でも十分使えます。
音質は当時の程々仕様(周波数特性10kHzから折り返し)なので、
本番にはあまり使う気にならないんだけどね。。



zrs90(5さい)

リンク

2023/6/12(Mon) 19:24:44|NO.99569

ソフトウエアMIDI音源ですが、これで何とかなるかも?
os標準の物より音質は良いはず?
ただ、usagi さん提示のスクリプトから
多少修正が必要になると思います

私は所持PCの都合上、ダウンロード出来ないんで
チェック出来ないんですが...

https://doslabo.com/blog/play-midi-software



窓月らら

リンク

2023/6/12(Mon) 19:32:36|NO.99570

MIDIの問題はそこなんですよね。
結局音源が作者の意図したものと一致していないと再現できない。
指定しておいてもユーザーが全員それを用意できる(してくれる)わけない。
OS側の設定でMIDIデバイスを指定してやらないといけない。
演奏の感じが変わってしまうのを割り切って実装する分にはいいんですけどね。



窓月らら

リンク

2023/6/12(Mon) 19:54:17|NO.99571

余計なお話ですが、その昔々サウンドブラスターにFM音源が搭載されておりました。
これが当時のほぼデフォのMIDI音源になっておりました。
でもすべてのMIDIデータがそれ用に作られてるわけがないので、データによっては凄くショボい演奏結果になってました。
これのせいなのかしらんですが、FM音源=ショボい という印象を与えてしまったのではないかと思ってます。
使い方の問題でそんなことは決してないんですがね・・・
mucom88も全くここの掲示板で話題にでてこないんですが、FM音源だからなの?
スナッチャーやソーサリアンで使われたあの音源だよ!!!(と言ってもわからんか?w)
確かに音色作りとかちょっと難しいですけどね、わかれば楽しいよ。(わかるまでが大変だけど)



usagi

リンク

2023/6/12(Mon) 21:56:03|NO.99572

>zrs90(5さい)さん
そうですね。いろいろやろうとすると修正が必要でございます。
まず、ドレミ鳴らしてみたい感じでしたので、
スクリプトから指定出来る感じで、最初は簡単なサンプルにしてみました。

楽器の様にリアルタイムにキーボードで演奏したいとなるとレイテンシーが酷くて無理かもです。
※スクリプトに書いた譜面をならす程度の遊びしかできませぬ。
※窓月ららさんの開発中のものを使うと良さそうな気がしてます。楽しみにしてます。
 (DirectSound使われているそうなので)

MIDIは演奏情報しかもちませんから、目的によっては向かないかもしれませんね。
ソフト音源は沢山ありますし、再現性重視ならwavかmp3に録音するのがいいかもです。



みてるぞ

リンク

2023/6/15(Thu) 23:37:57|NO.99577

5 年くらい前に HSP で MML 再生できるモジュール作ったことあります.
https://dev.onionsoft.net/seed/info.ax?id=1419

mmlplay.exe を hsp3.exe のあるフォルダに置き(実行ファイル作成する場合は実行ファイルと同じフォルダ),source.zip の中に入っている mod_xime.as をインクルードすると使えます.

基本は,mmlplay 命令で MML を文字列で指定して再生する方法になりますが,mmlset 番号, MML で先に MML を定義し,mmlplay 番号 で再生するやり方でもできます.
次のような感じです:


mmlset 0, "cdefgab<c" mmlplay 0



みてるぞ

リンク

2023/6/16(Fri) 00:07:09|NO.99578

すみません.
先ほどのリンクのは少し古くてコンパイルが低速です.
新しいのをアップロードしました:
https://drive.google.com/drive/folders/15hINHLmlH1K1UvNTxf1OjlMEWkrMPG3M

なお,プログラム実行時に mmlinit を叩く必要があります.
すなわち,次のような感じです:

#include "mod_xime.as" mmlinit mmlplay "cdefgab<c"



usagi

リンク

2023/6/16(Fri) 04:21:01|NO.99579

やってたら面白くなってしまって、少しソースが長いですが遊んでみました。
※Dキーでデモソング再生します。

#module #uselib "winmm.dll" #func midiOutOpen "midiOutOpen" int, int, int, int, int #func midiOutClose "midiOutClose" int #func midiOutShortMsg "midiOutShortMsg" int, int #func midiOutLongMsg "midiOutLongMsg" int, int, int #func midiOutPrepareHeader "midiOutPrepareHeader" int, int, int #func midiOutUnprepareHeader "midiOutUnprepareHeader" int, int, int #deffunc miopen midiOutOpen varptr(hmo), 0, 0, 0, 0 : return #deffunc miclose onexit if hmo != 0 { midiOutClose hmo } : return #deffunc mimsg int _msg midiOutShortMsg hmo, _msg : return #deffunc milmsg str _msg dim mhmidi, 16 : hex2bin data, _msg : len = stat mhmidi.0 = varptr(data), len, len midiOutPrepareHeader hmo, varptr(mhmidi), varsize(mhmidi) midiOutLongMsg hmo, varptr(mhmidi), varsize(mhmidi) repeat : wait 0 : if mhmidi.4&1 { break } : loop midiOutUnprepareHeader hmo, varptr(mhmidi), varsize(mhmidi) return #define ctype msg(%1,%2,%3) (%1)|((%2)<<8)|((%3)<<16) #defcfunc note int _ch, int _nn, int _vel if _vel = 0 { return msg($80+_ch, _nn, 64) } return msg($90+_ch, _nn, _vel) #defcfunc pc int _ch, int _pn return msg($C0+_ch, _pn, 0) #defcfunc cc int _ch, int _cn, int _data return msg($B0+_ch, _cn, _data) #defcfunc vol int _ch, int _data return msg($B0+_ch, $07, _data) #defcfunc pan int _ch, int _data return msg($B0+_ch, $0A, _data) #defcfunc pitch int _ch, int _bend data = limit(_bend+8192, 0, 16383) return msg($E0+_ch, /*lsb*/data&$7F, /*msb*/data>>7) #deffunc partmode int _ch, int _mode; 0:melody, 1:Drum tmp=17,18,19,20,21,22,23,24,25,16,26,27,28,29,30,31 milmsg strf("F04110421240%02X15%02X%02XF7", tmp(_ch), _mode, ($2B-_mode)-tmp(_ch)) return #deffunc hex2bin var _bin, str _hex hex = _hex : len = strlen(_hex)/2 : sdim _bin, len repeat len : poke _bin, cnt, int("$"+strmid(hex, cnt*2, 2)) : loop return len #deffunc miallstop repeat 16 : mimsg cc(cnt, $78, 0) : loop : return #deffunc instruments array _p repeat 16 : mimsg pc(cnt, _p(cnt)) : loop : return #deffunc volumes array _p repeat 16 : mimsg vol(cnt, _p(cnt)) : loop : return #deffunc panpots array _p repeat 16 : mimsg pan(cnt, _p(cnt)) : loop : return #deffunc partmodes array _p repeat 16 : partmode cnt, _p(cnt) : loop : return #deffunc misetup array _part, array _inst, array _vol, array _pan milmsg "F04110421240007F0041F7"; gs_reset partmodes _part : instruments _inst : volumes _vol : panpots _pan return #global miopen ; 初期化 ----------------------------------------- screen 0,1024,704 : onclick *L_ONCLICK : onkey *L_ONKEY transport = /*play*/1, /*click*/1 dim notes, 16, 128 : dim legatos, 16, 128 : sdim file, 2048 ; メイン ----------------------------------------- *MAIN ; エディット mw=mousew : ch = limit(ch+(mw<0) - (mw>0), 0, 15); チャンネル cn = limit(108-mousey/8,21,108) : ct = mousex/8 ;ノート title strf("ロケーター:%3d, 位置:%3d, チャンネル:%2d, ノートNo.:%3d",cl,ct,ch,cn) ; midi再生 if transport { if transport.1 { if cl\16=0 { mimsg note(9, 34, 64) } : if cl\4=0 { mimsg note(9, 33, 64) } } repeat 16 _cl = (cl+127)\128 : nn = notes(cnt,cl) : _nn = notes(cnt,_cl) if nn = 0 { mimsg note( cnt, _nn, 0) : continue } if legatos(cnt,_cl) { if nn!=_nn { mimsg note( cnt, nn, 100) } } else { mimsg note( cnt, _nn, 0) : mimsg note( cnt, nn, 100) } loop } ; 描画 redraw 0 : rgbcolor $AAAAAA : boxf ; 88鍵盤(21~108) repeat 88 if ($54A>>((21+cnt)\12))&1 { rgbcolor $DDDDDD } else { rgbcolor $FFFFFF } _y = ginfo_sy-8-cnt*8 : boxf 0, _y, ginfo_sx, _y+6 loop ; 8小節16分音符 repeat 128 if cnt\16 { rgbcolor $AAAAAA } else { rgbcolor $555555 } line cnt*8, 0, cnt*8,ginfo_sy loop ; ノーツ repeat 16: if cnt=ch {continue}: ich=cnt : repeat 128: ict=cnt if notes(ich,ict) = 0 { continue } _col = ich*11: _x = ict*8 : _y = ginfo_sy-8-(notes(ich,ict)-21)*8 hsvcolor _col,128,224 : boxf _x+2, _y+1, _x+6, _y+5 if legatos(ich,ict) = 0 { continue } hsvcolor _col,128,224 : boxf _x+2, _y+1, _x+10, _y+5 loop : loop repeat 128: ict=127-cnt if notes(ch,ict) = 0 { continue } _col = ch*11: _x = ict*8 : _y = ginfo_sy-8-(notes(ch,ict)-21)*8 hsvcolor _col,224,128 : boxf _x, _y, _x+8, _y+6 hsvcolor _col,128,224 : boxf _x+1, _y+1, _x+7, _y+5 if legatos(ch,ict) = 0 { continue } boxf _x+1, _y+1, _x+9, _y+5 loop ; ロケーター _x = ct*8 : rgbcolor $333333 : line _x, 0, _x, ginfo_sy _x = cl*8 : rgbcolor $333333 : boxf _x-1, 0, _x+1, ginfo_sy : rgbcolor $FFFFFF : line _x, 0, _x, ginfo_sy redraw 1 ; ティック if transport { cl=(cl+1)\128 } *L_WAIT await 90;仮デルタタイム goto *MAIN *L_ONCLICK if wparam = /*LC*/1 { legatos(ch,ct)^=(notes(ch,ct)!=0)&(notes(ch,(ct+1)\128)!=0) : notes(ch,ct) = cn } if wparam = /*MC*/16 { cl = (ct+127)\128 : miallstop} if wparam = /*RC*/2 { notes(ch,ct) = 0 : legatos(ch,ct) = 1 } goto *L_WAIT *L_ONKEY logmes ""+wparam if wparam = /*D */68 { gosub *L_DEMO_SONG } if wparam = /*N */78 { gosub *L_NEW } if wparam = /*S */83 { gosub *L_SAVE } if wparam = /*0 */79 { gosub *L_LOAD } if wparam = /*SP*/32 { transport^=1 } if wparam = /*C */67 { transport.1^=1 } if wparam = /*←*/37 { cl=limit(cl-16,0,127) } if wparam = /*→*/39 { cl=limit(cl+16,0,127) } if wparam = /*↑*/38 | wparam = /*↓*/40 { ch = limit(ch-(39-wparam), 0, 15) } miallstop goto *L_WAIT *L_NEW memset notes, 0, varsize(notes) : memset legatos, 0, varsize(legatos) return *L_SAVE repeat 2048 ich=cnt/128 : ict=cnt\128 poke file, cnt, (legatos(ich, ict)<<7) | notes(ich, ict) loop bsave "song.dat", file, 2048 return *L_LOAD bload "song.dat", file, 2048 *L_LOAD_2 repeat 2048 d = peek(file, cnt) : ich=cnt/128 : ict=cnt\128 notes(ich, ict) = d&$7F : legatos(ich, ict) = d>>7 loop return *L_DEMO_SONG ; デモソング用 ====================================================================================================================== ; melo fx lyr bs sub chd chd chd chd kick sn&cy hat s&cl sql sqr ; 音源 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 parts = 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 insts = $0A, $0A, $5B, $27, $25, $5F, $5F, $5F, $5F, $00, $19, $19, $00, $50, $50, $00 vols = $65, $45, $34, $4F, $5F, $45, $45, $45, $45, $7F, $70, $55, $60, $44, $34, $7F pans = $40, $40, $40, $40, $40, $00, $7F, $00, $7F, $40, $40, $40, $40, $10, $6F, $40 misetup parts, insts, vols, pans s ="0FDVVdBQ11cAAACA0FDVVdBQ11fVVQAAAAAAAAAAAADQUNVV11fZWYAA1VUAANJS01PSUtBQ0tLS0tJSAAAAANBQ1VXQUNdXAAAAANBQ1VXQUNdX1VUAANxc1VXQUNhY" s+="2dnZ2dlZ2NjY2NhY19fX19dXAACAgNBQ1VXXV9VVAAAAANBQ1VXQUNdXAAAAANBQ1VXQUNdX1VUAAAAAAAAAAAAA0FDVVddX2VkAANVVAADSUtNT0lLQUNLS0tLSUgAA" s+="AADQUNVV0FDXVwAAAADQUNVV0FDXV9VVAADcXNVV0FDYWNnZ2dnZWdjY2NjYWNfX19fXVwAAAADQUNVV11fVVcREyUnERMtLAAAAAMREy0vERMtLyUkAAAAAAAAAAAAA" s+="xETJSctLzU0AAMlJAADGRsdHxkbERMbGxsbGRgAAAADERMlJxETLSwAAAADERMlJxETLS8lJAADQUMlJxETMTM3Nzc3NTczMzMzMTMvLy8vLy8tLAADERMlJy0vJSQAA" s+="qqqqqqqqqiqAgKoqgACpqampqampqakpAAAAAKmpqSmurq6urq6uLgAAri4AAKysrKysrKysrCwAAAAArKysLKqqqqqqqqoqAACqKgAAqampqampqampKQAAAACtra0t" s+="rq6urq4ura2tra0trKysrKysrCwAAAAAsbGxsbGxsTGenp6enp6eHoAAnh6AAJ2dnZ2dnZ2dnR0AAAAAnZ2dHaKioqKioqIiAACiIgAAoCCgoKCgoKCgIAAAAACgoKAg" s+="np6enp6enh4AAJ4eAACdnZ2dnZ2dnZ0dAAAAAKGhoSGioqKioiKhoaGhoSGgoKCgoKCgIAAAAAClpaWlpaWlJcnJycnJyclJAADJSQAAyMjISMhIyMjISAAAAADIyMhI" s+="zc3NTc3NzU0AAM1NAADLy8vLy0vLy8tLgIAAAMvLy0vJyUnJyUnJSQAAyUkAAMjIyEjISMjIyEiAAAAAzMzMTM3Nzc3NTczMzMzMTMvLy8vLy8tLgAAAAMvLy8vLy8tL" s+="xsbGxsbGxkYAAMZGAADFxcVFxUXFxcVFAAAAAMXFxUXJyclJycnJSQAAyUkAAMfHx8fHR8fHx0cAAAAAx8fHR8bGRsbGRsZGAADGRgAAxcXFRcVFxcXFRQAAAADIyMhI" s+="ycnJyclJyMjIyMhIx8fHx8fHx0cAAAAAxsbGxsbGxsbExMTExMTERIAAxESAAMTExETERMTExEQAAAAAxMTERMjIyEjIyMhIAADISAAAxsbGxsZGxsbGRgAAAADGxsZG" s+="xMRExMRExEQAAMREAADExMRExETExMREAAAAAMfHx0fIyMjIyEjHx8fHx0fGxsbGxsbGRgAAAADExMTExMTERMHBwcHBwcFBAADBQQAAv7+/P78/v7+/PwAAAAC/v78/" s+="xMTERMTExEQAAMREAADCwsLCwkLCwsJCAAAAAMLCwkLBwUHBwUHBQQAAwUEAAL+/vz+/P7+/vz8AAAAAw8PDQ8TExMTERMPDw8PDQ8LCwsLCwsJCAAAAAMHBwcHBwcFB" s+="JIAAACQAAACAACSAgIAkgAAAJAAkAAAAAAAAAAAAAAAkAAAAJAAAAAAAAAAAACQAAAAAACQAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAJAAAACQAJAAAAAAAAAAAACQA" s+="JAAAAIAAJAAAAAAAJAAAAAAAAAAkAAAAAAAAAAAAAAC3gIAANwAAgCYAgAAAADcAAAA3AAAAAAAmAAAAAAAAADcAAAA3AAAAJgAAAAAANwAAAAAANwAAACYAAAAAAAAA" s+="NwAAAAAAAAAmAAAAAAA3AAAAAAA3AAAAJgAwLy0pKyk3AAAAAAA3ACYAAAA3AAAAAAAAADcAAAAmgAAAJgAAACoAKgAqKioqKoAqgCqAKoAqACoAKgAqACoAKgAqKioq" s+="KgAqACoqKioqACqAKgAqACoqKioqACoAKgAqACoqKioqACoAKioqKioAKgAqACoAKgAqACoAKgAqACoAKioqKioAKgAqKioqACoAKgAqACoqKioqKgAqACoAKgAqKioq" s+="gAAAAEUAAAAogAAARQCAAAAAAABFAAAAJwAAAEUAAAAAAAAARQAAACgAAABFAAAAAAAAAEUAAAAnAAAARQAAAAAAAABFAAAAKAAAAEUAAAAAAACARQAAACcAAABFAAAA" s+="AAAAAEUAAAAoAAAARQAAAAAAAABFAAAAJwAAACcAAAAAAAAAAAAAAElVYQAAAAAAAAAAAAAAUFxQXFBcAAAAAAAAAAAAAAAAaABhAGgAaAAAAAAAAAAAAFVXWVpcXmBh" s+="AAAAAAAAAAAASVVhAAAAAAAAAAAAAFBcUFxQXAAAAAAAAAAAAAAAAGgAYQBoAGgAAAAAAAAAAABVV1laXF5gYWEAAAAAAAAAAElVYQAAAAAAAAAAAAAAUFxQXFBcAAAA" s+="AAAAAAAAAAAAaABhAGgAaAAAAAAAAAAAAFVXWVpcXmBhAAAAAAAAAAAASVVhAAAAAAAAAAAAAFBcUFxQXAAAAAAAAAAAAAAAAGgAYQBoAGgAAAAAAAAAAABVV1laXF5g" s+="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" s+="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" #include "hspinet.as" b64decode file, s, strlen(s) : gosub *L_LOAD_2 : transport = 1, 0 : ch = 15 : return

窓月ららさんから指摘あったように音質がアレで本番や、
リアルタイムには遅延がキツイですが、勉強には良いかもですね。



buhio

リンク

2023/6/16(Fri) 22:38:55|NO.99581

 ちょっとした質問がえらいことになっておりますな

 p.s.うさぎさん いや〜いつもながらしびれますねぇ、、もうこれでええやん。。

 ちなみに、3連符が表現できないので、1小節は何分割だっけ、なんかそういうのがあったような
 些細なことですが f(^^)



窓月らら

リンク

2023/6/17(Sat) 16:29:11|NO.99583

発音の長さについてはいくつかやり方があると思うので、うちが MI392DRV で採用した方法を元に簡単に解説。

まず、tempo=120 の場合は1小節(全譜)は 2000 と定義します。2000msです。
なので、例えば4分音符であれば

2000/4 = 500ms

です。

3連符であれば例えば

2000/6 = 333.33....
2000/12= 166.66....

となります。この計算には実数が必要なことがこれでわかります。しかも割り切れないケースもある。
この割り切れない分はどこかのタイミングで調整してやる必要がでてきます。

基本上の考えだけでできます。で、テンポはどうするのかというと
うちは基準タイマーのほうを調整することで実装しています。
tempo=120 の場合はそのまま1msでカウントアップするタイマーですが
進み具合を変えてやればシンプルに実装することができます。
誤差を最小限にするために、タイマーも実数が必要になります。



窓月らら

リンク

2023/6/17(Sat) 16:43:16|NO.99584

ちなみに、某Discordのほうでチラっと書いたのですが、
Windows環境のタイマーは精度があまりよくないんで、await命令も1msの精度はありません。
2〜5ms程度の精度だと思ってください。
1ms精度だと思い込んで開発してるとハマることがあるんで。

MI392DRV では PerformanceCounter を採用しました。
これについては過去ログを検索して頂ければ、何人か言及されています。



usagi

リンク

2023/6/17(Sat) 16:51:20|NO.99585

>buhioさん 3連符
midiに限って言うと、昔は4分音符を480Tick(最近は960)が多いですね。
どちらも3,4の公倍数であり、割り切りますから譜面の再現に最適だったわけです。
(なので1小節は480Tickであれば1920分割)

私のサンプルだとawaitで手を抜いてしまってるので、
構造が違うので対応できないですね。。。

1TickはBPM125なら1msのタイマー割り込みになります。



usagi

リンク

2023/6/17(Sat) 16:55:17|NO.99586

あっ、コメント書いてリロードしたら投稿被ってしまいました。
すみません。



窓月らら

リンク

2023/6/17(Sat) 21:40:06|NO.99591

usagiさんが480とか960とか1920とか折角出してくれたので補足。
これはMIDIやってる方であればおなじみのティックです。タイマーの分解能だと思ってもらえればokです。

そもそもがMIDIはいつの時代に作られたものかって歴史を少しみるとわかるんですが
1980年代のまだ8bitパソコンだった時代に作られたもので、当時は実数演算をするには
かなりのコストがかかりました。つまり遅くて話にならなかったのです。
ですので、できるだけ整数演算で済むようにする必要がありました。

しかし、現在は多少の誤差に目をつむれば、実数で計算してしまえば解決する問題です。
昔みたいに実数だからって使えないほど遅くなることもありません。

また、例えば1920を基準にしてみても、たまにでてくる7連符や9連符のようなものでは
結局割り切れないことになります。
最近は無いと思いますが、昔の演奏ソフトではこういうイレギュラーな値をつっこむと
見事にテンポずれするものがありました。
(ちなみに MI392DRV ではどんなのを突っ込んでもテンポずれしません。)

上記は自動演奏の場合の話なので、例えばタッチ画面にキーボードを描画して
演奏するようなソフトを作りたいのであれば、タイマーは特に関係ないです。
タッチしたらMIDI-OUTからコマンドを送るだけで作れると思います。
(音質や遅延等は環境によります)



kinokawa

リンク

2023/6/18(Sun) 01:19:47|NO.99594

私事ですがmmlの話が出たので

昔mmlに夢中になったことがあって。といっても
x68のmdxとかゲームの音楽をダウンロードしてただけなんで
オリジナルのmmlがほとんどないのですが(^^;

で、ニコニコ大百科は日本音楽著作権協会(JASRAC)の許諾を受けてるみたいなので
過去にはmdxを変換したものをアップしてみたり・・

HSPMUCOMがすごくいいと思ったのですが
mdxを変換したものだと、著作権の問題で発表する場がないんですよね



窓月らら

リンク

2023/6/18(Sun) 01:56:14|NO.99595

ニコニコやYouTubeはJASRAC管理曲については、自分で演奏したものに限りokですね。
なので私のソフトのサンプル音声もいずれはYouTubeで公開する予定ではあります。
でもこれらのMMLソースを広く公開することはできません。
よって、サンプルとして同梱するものは著作権切れかオリジナルのものになりますねー

いろんなMMLな環境触ってきてかゆいところに手が届かないなーってのも
解決したいので、思いつくのはすべて実装します。
いまはジャンプ命令(アドレスポインタ移動)を実装しようとしているところです。。



GENKI

リンク

2023/6/19(Mon) 22:28:27|NO.99614

> タッチ画面もあるし、楽器みたいのは作れないかぁなどと妄想しています。

MIDI方面の話ばかりみたいなので、他の方法についても書いてみます。
楽器が作りたいなら、音階ごとに音声ファイルを準備して、操作が行われたら音声ファイルお再生するという方式が考えられます。ゲームの効果音と同じ方針です。

HSP3でWAV形式などの音声ファイルを再生する場合、標準では3種類の方法が用意されています。

・mci命令
・mmplay命令などmm系命令
・dmmplay命令などdmm系命令

この内、音を重ねて再生できるのは、mm系をDishやHGIMG4で使用した場合と、dmm系の2つです。この方法で楽器を作るなら、このどちらかから選択することになります。
この方法は、別途音声ファイルの準備は必要という面倒さはありますが、ファイルさえあればどんな音でも楽器にできます。(楽器でも爆発音でも猫の鳴き声でも…)

補足
https://mclab.uunyan.com/lab/hgimg4/hgimg4_022.htm



GENKI

リンク

2023/6/19(Mon) 22:40:03|NO.99615

求めていた回答ではないと思います。しかし、書かずにはいられないので書いてしまいます。


> 例えば自分でドレミファソラシドを指定して鳴らすことってできるんでしょうか?

それ、ビープ音で出来ます!音源?なんていりません!

beep音階モジュール?
http://hsp.tv/play/pforum.php?mode=pastwch&num=68473

そのほかのモジュール
https://mclab.uunyan.com/dl/dl44.htm



窓月らら

リンク

2023/6/20(Tue) 01:34:20|NO.99617

beep は環境によっては鳴らないらしいので注意が必要です。
もっとも私の新しい環境でも鳴るんで、大半は鳴ると思いますが。
いちおうはじめて知った人のために補足すると、これは本来はブザー用です。
昔からあったよねー。
ポケコンにすらありました。ピッて鳴るだけのやつでしたが。



GENKI

リンク

2023/6/20(Tue) 23:30:17|NO.99620

> beep は環境によっては鳴らないらしいので注意が必要です。

NO.99615 の掲示板の方は、beep 関数なので古いパソコンだと指摘の通り。ただWin7頃から、スピーカーから正弦波で再生される仕様に変わっています。今はもう心配不要です。
また、後者のモジュールの方は、waveOutWrite 関数で実装(昔の矩形波のビープ音を再現)してるのでWindows環境なら問題なく再生できます。



ONION software Copyright 1997-2023(c) All rights reserved.