如何在Delphi中创建声音注释?

12
有没有一种命令能让我们的Delphi应用程序仿效Basic中那样选择数字音调和持续时间来模拟声音?

2
类似于 Windows.Beep(频率, 持续时间_毫秒) 这样的东西? - bummi
5
谁给踩了?这有点太苛刻了... - Shambhala
如果您尝试使用Beep,Delphi会提示没有参数,因为它从系统单元中找到了beep函数。您必须指定winApi.Windows.beep函数才能获得正确的音调功能。谢谢大家! - NaN
这个伟大的网站上的一些人认为他们已经掌握的知识不应该被问到。这仅仅是用于高级问题。不幸的是。 - NaN
为了避免误解,我没有点踩,只是确信会有人提供更好的答案,就像@AndreasRejbrand所做的那样。 - bummi
1个回答

19

为了产生一个纯正的正弦波,你可以使用

Windows.Beep(400, 1000)

将会发出一个持续1000毫秒的400 Hz纯正正弦波。

如果你想演奏真实的乐器(钢琴,吉他或其他125个选项中的任何一个),你可以使用MIDI。只需使用MMSystem单元并执行:

var
  mo: HMIDIOUT;

const
  MIDI_NOTE_ON = $90;
  MIDI_NOTE_OFF = $80;
  MIDI_CHANGE_INSTRUMENT = $C0;

function MIDIEncodeMessage(Msg, Param1, Param2: byte): integer;
begin
  result := Msg + (Param1 shl 8) + (Param2 shl 16);
end;

procedure NoteOn(NewNote, NewIntensity: byte);
begin
  midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_NOTE_ON, NewNote, NewIntensity));
end;

procedure NoteOff(NewNote, NewIntensity: byte);
begin
  midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_NOTE_OFF, NewNote, NewIntensity));
end;

procedure SetInstrument(NewInstrument: byte);
begin
  midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_CHANGE_INSTRUMENT, NewInstrument, 0));
end;

procedure InitMIDI;
begin
  midiOutOpen(@mo, 0, 0, 0, CALLBACK_NULL);
  midiOutShortMsg(mo, MIDIEncodeMessage(MIDI_CHANGE_INSTRUMENT, 0, 0));
end;
在您初始化MIDI系统后,您可以尝试。
NoteOn(50, 127);
Sleep(500);
SetInstrument(60);
NoteOn(60, 127);
Sleep(500);
NoteOff(60, 127);
SetInstrument(80);
NoteOn(70, 127);
Sleep(500);
NoteOff(70, 127);
SetInstrument(90);
NoteOn(80, 127);
Sleep(500);
NoteOff(80, 127);
SetInstrument(100);
NoteOn(90, 127);
Sleep(500);
NoteOff(90, 127);
SetInstrument(12);
NoteOn(40, 127);
Sleep(1000);
NoteOff(40, 127);

MIDI编程真是太被低估了!

已编译的演示程序EXE


1
@TLama:你是认真的吗?我觉得它听起来很美,而且创造美丽有趣的声音非常简单。[而且MIDI文件不占用空间!] - Andreas Rejbrand
1
是的,自从我成为一名现场DJ(远离仅仅播放CD),我的对声音的期望与MIDI不同;-) - TLama
MIDI是音乐制作的入门级别。它是在乐器层面上进行的,只有在模拟几个原始乐器时才应该考虑使用。然而,真正的制作来自于更高级的机制来调整声音,例如合成器和滤波器。 - Jerry Dodge
@Jerry等人,我知道。但我认为MIDI编程非常有趣!至少我可以花几个小时来玩它!而且,在我看来,结果通常非常出色。 - Andreas Rejbrand
当我们应用那些效果,比如混响,它听起来很棒! - NaN
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接