2013-04-20 11 views
11

Esiste un comando che consenta alla nostra applicazione Delphi di emulare il suono in cui possiamo scegliere il tono numerico e la durata come in basic?Come creare note sonore in Delphi?

+2

Qualcosa di simile Windows.Beep (Frequenz, Duration_in_ms); ? – bummi

+5

Chi ha votato? Questo è un po 'duro ... – Shambhala

+0

Se provi Beep, Delphi dice che non ha parametri perché trova la funzione beep dall'unità di sistema. È necessario specificare la funzione winApi.Windows.beep per ottenere le capacità di tono appropriate. Grazie ragazzi! – PSyLoCKe

risposta

15

per produrre un tono sinusoidale pura, è possibile utilizzare

Windows.Beep(400, 1000) 

, che suonerà un 400 Hz puro tono sinusoidale per una durata di 1000 millisecondi.

Se si desidera suonare uno strumento reale (piano, chitarra o una qualsiasi delle 125 (?) Altre opzioni), è possibile utilizzare il MIDI. Basta usare l'unità MMSystem e fare

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; 

Dopo aver inizializzato il sistema MIDI, si può provare

programmazione
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 è così sottovalutata!

Compiled demo EXE

+0

* La programmazione MIDI è così sottovalutata! * Sì, perché chi vorrebbe sentire un tale suono :-) [+1 per Windows.Beep] – TLama

+1

@TLama: Sei serio? Penso che suoni bello, ed è molto semplice creare suoni belli e interessanti. [E i file MIDI non occupano spazio!] –

+1

Sì, dato che sono un DJ dal vivo (molto lontano dal solo riprodurre CD), la mia aspettativa per un suono è diversa dal MIDI ;-) – TLama

Problemi correlati