我正在开发一个java项目,它使用javax.sound.midi库从midi硬件接收midi事件.在文档中,它表示MidiSystem.getMidiDeviceInfo()返回所有连接的midi硬件的列表.它适用于我,但问题是,它只能工作一次.第一次实际扫描设备需要花费一些时间,但每次之后,即使已连接新设备,它也会立即返回相同的列表.有没有办法强迫它重新扫描?如果重新启动应用程序,它将重新扫描,但我不希望我的用户在连接新的midi设备时必须重新启动.
顺便说一下,我正在使用Mac OS X ......有人指出,不同操作系统的行为可能会有所不同.
我似乎无法让乐器改变.我切换了仪器的值,但输出没有任何不同.无论我尝试什么价值,我都只能拿钢琴乐器演奏.这是下面的简单代码.有没有人有什么建议?或者我错过了仪器对象的基本原理?
import javax.sound.midi.*;
//import javax.sound.*;
public class Drum {
static int instrument = 45;
static int note = 100;
static int timbre = 0;
static int force = 100;
public static void main(String[] args) {
Synthesizer synth = null;
try {
synth = MidiSystem.getSynthesizer();
synth.open();
}
catch (Exception e) {
System.out.println(e);
}
Soundbank soundbank = synth.getDefaultSoundbank();
Instrument[] instr = soundbank.getInstruments();
synth.loadInstrument(instr[instrument]); //Changing this int (instrument) does nothing
MidiChannel[] mc = synth.getChannels();
mc[4].noteOn(note, force);
try { Thread.sleep(1000); }
catch(InterruptedException e) {} …Run Code Online (Sandbox Code Playgroud) 我有一个 midi 文件,我想在网页上播放该文件,目前我正在使用 midi.js 播放器进行播放,但它不适用于移动浏览器。
请指导我如何播放该文件,否则我如何播放 MIDI 或将其转换为 mp3
这是我的代码
$data = fopen ($midi, 'rb');
$size= filesize($midi);
$contents = fread ($data, $size);
fclose($data);
$encoded= base64_encode($contents);
$encode = "'data:audio/midi;base64,".$encoded."=='";
Run Code Online (Sandbox Code Playgroud)
最后将 base64 值传递给 midi.js
晚上好.我正在尝试用质量好的声音库写一个简单的midi播放器.面对播放midi文件的问题.问题是midi的所有曲目(鼓,鼓,贝斯,合成器等)都播放了,但它们只演奏一个乐器.我找到了OS X的解决方案,我需要iOS解决方案.我是否必须使用kAudioUnitSubType_Sampler为每个乐器audioUnit创建?
提示可以实时更改所选通道上的仪器吗?如何实施?对不起我的英语不好 ((
这是我的代码,它无法正常工作:
// Create a client
MIDIClientRef virtualMidi;
Check(MIDIClientCreate(CFSTR("Virtual Client"),
MyMIDINotifyProc,
NULL,
&virtualMidi));
// Create an endpoint
MIDIEndpointRef virtualEndpoint;
Check(MIDIDestinationCreate(virtualMidi, CFSTR("Virtual Destination"), MyMIDIReadProc, samplerUnit, &virtualEndpoint));
// Initialise the music sequence
NewMusicSequence(&midiSequence);
if (!midiFilePath) {
midiFilePath = [[NSBundle mainBundle]
pathForResource:@"carelesswhisper"
ofType:@"mid"];
}
NSLog(@"midiFilePath %@", midiFilePath);
// Create a new URL which points to the MIDI file
NSURL * midiFileURL = [NSURL fileURLWithPath:midiFilePath];
MidiParser *midiParser = [[MidiParser alloc] init];
NSData *data = [NSData dataWithContentsOfFile:midiFilePath];
[midiParser parseData:data];
NSString *midiInfo = …Run Code Online (Sandbox Code Playgroud) 我最近从Head First Java的代码中实现了一个MIDI Beatbox,并且非常想用Java的MIDI功能做更多的事情.我认为我可能会首先在现有代码中添加更多非打击乐器,但我似乎无法找到可用乐器及其int键的直接列表.
这样的列表是否存在Soundbank于JDK附带的任何地方?
Silverlight可以与连接到运行Silverlight应用程序的机器的MIDI乐器进行通信吗?进出浏览器.
我正在使用嵌入播放器播放 MIDI 文件。它在 mozilla 和资源管理器中播放,我如何在 chrome 中播放 midi 文件,是否有任何扩展或插件可以在 chrome 中播放 midi。
这是我的代码
<object
id="MediaPlayer" width="300" height="300"
classid="CLSID:6BF52A52-394A-11D3-B153-00C04F79FAA6"
standby="Loading Microsoft Windows Media Player components..."
type="application/x-oleobject">
<param name="Url" value="suite1.mid">
<param name="AutoSize" value="true">
<param name="AutoStart" value="true">
<param name="Balance" value="0">
<param name="DisplaySize" value="0">
<param name="Mute" value="false">
<param name="PlayCount" value="0">
<param name="Rate" value="1.0">
<param name="ShowAudioControls" value="true">
<param name="ShowControls" value="true">
<param name="ShowDisplay" value="true">
<param name="ShowStatusBar" value="true">
<param name="ShowTracker" value="true">
<param name="StretchToFit" value="false">
<param name="TransparentAtStart" value="false">
<param name="Volume" value="100">
<embed type="application/x-mplayer2"
name="mediaplayer"
pluginspage="http://www.microsoft.com/Windows/MediaPlayer"
src="suite1.mid"
Height="300"
Width="300" …Run Code Online (Sandbox Code Playgroud) 自从我开始阅读“用计算机制作音乐:Python 中的创意编程”这本书已经有几个星期了,现在我在尝试用这个库播放鼓声时陷入困境。我正在使用 Mit 的 music21 库,因为书中提出的库对我不起作用(简称为“音乐”)。这是本书用来播放低音鼓声音的代码示例:
from music import *
drumPart = Part("Drums", 0, 9)
note = Note(ACOUSTIC_BASS_DRUM, QN) # a bass drum strike
drumPhrase = Phrase()
drumPhrase.addNote(note)
drumPart.addPhrase(drumPhrase)
Play.midi(drumPart)
Run Code Online (Sandbox Code Playgroud)
我尝试在 music21 中用 Hi Hat 声音做同样的事情,但没有播放声音:
import music21
from music21 import note, stream, pitch, duration, instrument, tempo, chord
from music21.note import Note, Rest
from music21.chord import Chord
from music21 import midi
def createInstrument(instrument, midiChannel):
i = instrument
i.midiChannel = midiChannel
return i
n = Note("A2", type='quarter')
drumPart = stream.Part()
drumPart.insert(createInstrument(instrument.HiHatCymbal(), …Run Code Online (Sandbox Code Playgroud) 我试图在flash midi文件中可视化(使用外部midi-to-flash库)
有没有办法在midi文件中区分Violin,Viola,Cello和Contrabass.我得到了仪器的这些值(忽略数字):
1长笛13
2双簧管15
3单簧管14
4巴松管16
5法国号角18
6小号17
7定音鼓26
8弦乐合奏1 3
9弦乐合奏1 3
10弦乐合奏1 3
11弦乐合奏1 3
12弦乐合奏1 3
13原声大钢琴5
14原声大钢琴5
15原声大钢琴5
16 Acoustic Grand Piano 5
如您所见,所有字符串都获得相同的"String Ensemble"值...
一种方法是询问每个音符是高(65>)还是低(50 <)等,并通过大致决定乐器类型(对于特定音符).但由于这些值是随机的而且不准确 - 不能正确分离它们(特别是因为不同的工具仍然具有共享的音符高度值).
它是在midi文件中写的(大提琴,小提琴......)吗?
有没有办法承担它?
我有5首曲目.是否可以假设(例如)前两个是小提琴,第三个是大提琴等?或者他们都是混合的?
我想将 midi 钢琴键盘插入计算机的 USB 端口,并通过在浏览器中显示某些内容来响应按键事件。
有谁知道有一个库可以允许 JavaScript 与前端/浏览器中的 USB midi 键盘事件交互?
类似于:
链接到index.html的script.js文件:
$(document).on('midi-key-press', function(event) {
alert('the key that you pressed was ' + event.whichKey);
});
Run Code Online (Sandbox Code Playgroud)
谢谢!
我使用的默认合成器的音库包含各种不同的乐器。例如,这段代码片段...
Synthesizer synthesizer = MidiSystem.getSynthesizer();
synthesizer.open();
Instrument instruments = synthesizer.getDefaultSoundbank().getInstruments();
for (Instrument i : instruments)
System.out.println(i);
Run Code Online (Sandbox Code Playgroud)
...打印以下内容:
Instrument: Piano 1 bank #0 preset #0
Instrument: Piano 2 bank #0 preset #1
[...]
Instrument: Applause bank #0 preset #126
Instrument: Gun Shot bank #0 preset #127
Instrument: SynthBass101 bank #128 preset #38
Instrument: Trombone 2 bank #128 preset #57
[...]
Instrument: Machine Gun bank #128 preset #127
Instrument: Echo Pan bank #256 preset #102
Instrument: String Slap bank #256 preset #120 …Run Code Online (Sandbox Code Playgroud) 我发现的唯一方法是使用music21:
m = converter.parse(path)
for m in m.parts:
print(m[0])
Run Code Online (Sandbox Code Playgroud)
但它的输出不正确:
Piano
Piano
Run Code Online (Sandbox Code Playgroud)
空位也是一个乐器名称,它只是无法读取它,但问题不在文件中,因为我可以将其正确导入到tuxguitar 中。此外,music21 无法传递大的 MIDI 文件并卡住。我尝试了 mido 库,但没有办法获得 track instrument,我找到了一个属性,但不知道如何使用它。
如何用python解析midi曲目的乐器?
midi-instrument ×12
midi ×11
java ×4
audio ×2
music21 ×2
python ×2
audio-player ×1
embed ×1
flash ×1
ios ×1
javascript ×1
javasound ×1
php ×1
sample ×1
silverlight ×1
web-midi ×1