我正在嘗試使用 Perl 發送 MIDI 訊息。基本上我想改變補丁樂器。由于我不是生成檔案,而只是播放,我正在使用Win32::MIDI它,因為它是唯一適用于我需要的模塊,但沒有模塊補丁樂器方法,因此我writeMIDI需要向它發送 MIDI 訊息。
例如。
...
# note_on event, channel 1 (0x90), velocity (127), note (127), null (0x00);
my $data_on = "\x00\127\127\x90";
# note_off event, channel 1 (0x80), velocity (127), note (127), null (0x00);
my $data_off = "\x00\127\127\x80";
$midi_obj->writeMIDI(unpack("N",$data_on));
sleep(2);
$midi_obj->writeMIDI(unpack("N",$data_off));
$midi_obj->writeMIDI(unpack("N","\x00\C18")); <-- NOT WORKING change instrument on channel # 1 to patch # 8
我正在嘗試在通道 1 上進行“程式更改”,補丁編號(例如 8),因為這會更改補丁樂器。
正如我的參考文獻中所說:
A.1. 頻道語音留言:
指示接收樂器為其聲音分配特定的聲音 打開和關閉音符 改變當前活動的一個或多個音符的聲音
Voice Message Status Byte Data Byte1 Data Byte2
Note off 8x Key number Note Off velocity
Note on 9x Key number Note on velocity
Polyphonic Key Pressure Ax Key number Amount of pressure
Control Change Bx Controller number Controller value
Program Change Cx Program number None
Channel Pressure Dx Pressure value None
Pitch Bend Ex MSB LSB
Notes: `x' in status byte hex value stands for a channel number.
參考我正在使用 https://users.cs.cf.ac.uk/Dave.Marshall/Multimedia/node158.html
uj5u.com熱心網友回復:
解包(“N”,“\x00\C18\7F”)
這看起來不正確,沒有字串轉義\C。此外,如果你試圖寫一個八進制轉義,仍然C18和7F不會是八進制數。請說明您想用十六進制寫什么。
可以在perlop 中找到有關八進制轉義的更多資訊:
\033
結果是000到777范圍內的三位八進制數指定的字符(但最好不要在077以上使用,見下一段)
某些背景關系允許使用 2 位甚至 1 位數字,但任何沒有精確到 3 位數字(第一個為零)的用法可能會產生意外結果。(例如,在正則運算式中,它可能與反向參考混淆;請參閱 中的“八進制轉義”
perlrebackslash。)從 Perl 5.14 開始,您可以使用它\o{}來代替,這樣可以避免所有這些問題。否則,最好僅對序數\077及以下使用此構造,記住在左側填充零以組成三位數字。對于較大的序數,使用\o{},或轉換為其他內容,例如十六進制并使用\N{U }(在具有不同字符集的平臺之間可移植)或\x{}改為。
更新:
我正在嘗試進行“程式更改”,因為這會更改補丁樂器。
根據this和this你可以嘗試這樣的事情:
my $channel_number = 1;
my $program_number = 15;
my $unused = 0;
my $str = pack("CCCC", $unused, $unused, $program_number, $channel_number 0xC0);
$midi_obj->writeMIDI(unpack("N",$str));
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/399096.html
