![]() |
The Old-Style-Music-PLAY-Function
Liste der Anhänge anzeigen (Anzahl: 4)
Hiiiiihooo, :hi:
wer von euch kennt denn noch das gute alte DOS und vorallem das wunderschöne QBasic? Okey, Okey, jetzt nur nicht so stürmisch die Hände heben. :lol: Nja, in Zeiten, wo es mit Delphi langsam zu Ende geht, da muß man sich ja Alternativen suchen *hust*. Oder man holt sich die Funktionen von dort in die Moderne. :angel2: Hier hätten wir also eine nette Sound-(Play)-Funktion: Es geht eigentlich recht einfach und jeder, der Musik hatte und mit Noten umgehn kann, kommt vermutlich damit zurecht ... ansonsten kann man ja auch einfach so damit rumspielen. :mrgreen:
Delphi-Quellcode:
Gut, es ist jetzt vielleicht nicht gerade eine super High-Tech-Funktion,
// das Nibbles-Startlied
Play('T200o3L8CDEDCDL4ECC'); // und eine einfache Tonleiter (klettert mir bloß nicht zu hoch, es geht tief runter) Play('MS L8 o1CDEFGABH o2CDEFGABH o3CDEFGABH o4CDEFGABH o5CDEFGABH'); aber vorallem Anfänger sollten damit sehr leicht ein bissl Ton in ihre Spiele/Programme reinbekommen können. Der Befehlssatz ist auch recht übersichtlich. Und selbst wenn man nicht gut komponieren kann, dann sollte es nicht schwer sein sich was aus irgendeinem Notenblatt abzuschreiben. :nerd:
Code:
Hier ist also praktisch alles drinnen, was QBasic auch schon konnte.
Oktaven- and Ton-Befehle:
Ox setzt die Oktave (0 - 8 : Standard = 4) 0 = Kontra-Oktave 1 = Große Oktave 2 = Kleine Oktave 3 = Eingestrichene Oktave 8 = Sechsgestrichene Oktave < oder > setzt die aktuelle Oktave um 1 herab oder herauf A - H spielt die angegebene Note in der aktuellen Oktave Nx spielt die angegebene Note im gesamten Oktavenraum 0=O0C 4=O0G 7=O0H 56=O7C 63=O7H Xx spielt die angegebene Frequenz (37 - 32767) Dauer- und Tempo-Befehle: Lx Setzt die Länge der Noten (1 - 64 : Standard = 4) 1 = ganze Note 2 = halbe Note 64 = 64-tel Note Mx setzt die musikalische Vortragsanweisung auf Legato (ML), Normal (MN : Standard) oder Staccato (MS) Px definiert eine Pause (siehe Lx) Tx setzt das Tempo auf viertel Noten pro Minute (32 - 255 : Standard = 120) Abspiel-Modus: Mx spielt die Musik im Vordergrund (MF = synchron : Standard) oder Hintergrund (MB = asynchron) ab Zusatzbefehle: # or + setzt die vorhergehende Note um einen halben Ton herauf - setzt die vorhergehende Note um einen halben Ton herab . spielt die vorhergehende Note um 3/2 (1.5x) länger, als angegeben OK, der Background-Modus ist (noch) nicht integriert, aber mal sehn, vielleicht gibt es irgendwann auch 'ne Version, welche über die Soundkarte läuft. [edit] der Befehl X wurde noch schnell eingefügt (gibt es zwar in QBasic nicht, aber kann bestimmt spaßig sein) [edit2] Demo hinzugefügt |
Re: The Old-Style-Music-PLAY-Function
Liste der Anhänge anzeigen (Anzahl: 1)
So,
Ich hab dein Projekt mal 12fix nach Linux für Lazarus portiert! (ich würde vermuten dass das dann auch mit Mac geht :D) (s. Anhang). So noch was zum allgemeinen: Finde ich richtig toll ^^ Funktioniert sogar einwandfrei :mrgreen: Gruß Teekeks |
Re: The Old-Style-Music-PLAY-Function
Zitat:
Ding, Dang, Dong:
Delphi-Quellcode:
k. A.:
PLAY('O5 L4 CD L8 ED L4 CCD L8 ED L4 CEF L2 G L4 EF L2 G');
Delphi-Quellcode:
nich die simsons:
PLAY('MFT120L8<GL16P16FEL8FL4GL16P8P16L8B>C<BL16AL8GL4GL16P8P16L8B>C<BL16AL8GGGGL16BL8>C<L2B');
Delphi-Quellcode:
Let's go Range error. ;)
PLAY('MFT120L8<AL16P16AA>P4P16DP16DP16[B]P16L8CL16P16CCP4P16FP16F');
Delphi-Quellcode:
PLAY('MFT180o2P2P8L8GGGL2E-P24P8L8FFFL2D');
Das müsste sich leicht auf die Soundcart übertragen lassen. Ich erinnere mal schnell an das ![]() |
Re: The Old-Style-Music-PLAY-Function
@TP: das war mir garnicht aufgefallen :oops:
na mal sehn, was da noch alles möglich ist. Kann es sein, daß dieses Sound/NoSound in Delphi nicht gibt? Allerdings bin ich bei der Suche danach in der Windows.pas vorbeigekommen und dort gibt es tatsächlich sowas: :shock:
Delphi-Quellcode:
Eigentlich klingt es ja voll genial, aber in Delphi sind nirgendwo die nötigen Funktionen zu finden :cry:
{ WaitSoundState() Constants }
S_QUEUEEMPTY = 0; S_THRESHOLD = 1; S_ALLTHRESHOLD = 2; { Accent Modes } S_NORMAL = 0; S_LEGATO = 1; S_STACCATO = 2; { SetSoundNoise() Sources } S_PERIOD512 = 0; { Freq = N/512 high pitch, less coarse hiss } S_PERIOD1024 = 1; { Freq = N/1024 } S_PERIOD2048 = 2; { Freq = N/2048 low pitch, more coarse hiss } S_PERIODVOICE = 3; { Source is frequency from voice channel (3) } S_WHITE512 = 4; { Freq = N/512 high pitch, less coarse hiss } S_WHITE1024 = 5; { Freq = N/1024 } S_WHITE2048 = 6; { Freq = N/2048 low pitch, more coarse hiss } S_WHITEVOICE = 7; { Source is frequency from voice channel (3) } S_SERDVNA = LongWord(-1); { Device not available } S_SEROFM = LongWord(-2); { Out of memory } S_SERMACT = LongWord(-3); { Music active } S_SERQFUL = LongWord(-4); { Queue full } S_SERBDNT = LongWord(-5); { Invalid note } S_SERDLN = LongWord(-6); { Invalid note length } S_SERDCC = LongWord(-7); { Invalid note count } S_SERDTP = LongWord(-8); { Invalid tempo } S_SERDVL = LongWord(-9); { Invalid volume } S_SERDMD = LongWord(-10); { Invalid mode } S_SERDSH = LongWord(-11); { Invalid shape } S_SERDPT = LongWord(-12); { Invalid pitch } S_SERDFQ = LongWord(-13); { Invalid frequency } S_SERDDR = LongWord(-14); { Invalid duration } S_SERDSR = LongWord(-15); { Invalid source } S_SERDST = LongWord(-16); { Invalid state } Selbst Google und MSDN schweigen sich da mehr drüber aus, aber letztendlich hab ich einfach mal die gesamte Festplatte durchsuchen lassen und wurde fündig. WaitSoundState und SetSoundNoise verstecken sich in %WinDir%\System\SOUND.DRV und nochmals in %WinDir%\System32\sound.drv . Jetzt gibt es nur ein Problem: ich hab absolut keine Ahnung, wie man diese ansteuert. Nja, immerhin läuft das Windows.Beep (vielleicht zerdebugge ich dieses einmal und finde einen/den Weg). |
Re: The Old-Style-Music-PLAY-Function
Für mich als Pianisten eine interessante Funktion...
Coming up: Bach - Tocatta mit Fuge in D-Moll; vorgetragen mit Delphi.PLAY() :cyclops: Ich schau mir das glaub ich mal genauer an... :mrgreen: |
Re: The Old-Style-Music-PLAY-Function
Zitat:
@himi, Doch ich glaube das gab es mal. ziemlich sicher bei Turbo Pascal und auch den ersten Delphiversionen. Irgend wann wurde es Win oder so nicht weiter unterstützt. Ich galube ab NT. An sonsten in einen Thrad verlagern. So hab ich es bei ![]() |
Re: The Old-Style-Music-PLAY-Function
Ich hab keine Ahnung wo das bei Delphi ist... Ich vermute es gibt da keine unit namens crt? (da ist das drinne)
Roter kasten: die Unit crt gibts bei TurboPascal ^^ |
Re: The Old-Style-Music-PLAY-Function
@turboPASCAL:
Also das mit dem MIDI hört sich schon cool an. Wenn ich die Befehle noch etwas um eine Instrumentenauswahl und Lautstärkte erweitere, dürfte was Brauchbares rauskommen, aber ich glaub das "Beep" laß ich auch mit drinnen. Der PC-Speaker ist ja manchmal richtig nützlich (z.B. für Alarmsignale). Wenn ich dann noch etwas weiterspinne ... vielleicht fällt mir dan sogar noch ein, wie ich das ganze dann noch mehrstimmig bekomme :roll: Das mit dem Thread war schon klar, also für die Background-Wiedergabe, aber ich war erstmal froh daß ich nun die Frequenten und Längenberechnungen richtig hinbekommen hab und das sogar wesentlich kürzer, als es anfangs war und auch von Debuggen her war es einfacher ohne Threads. Gut, dann werde ich die Oktaven noch etwas ändern müssen, denn hier wird alles eine Oktave tiefer abgespielt, als es QBasic machte, aber dafür gab es insgesamt mehr Oktaven und so wie es aussieht, hat man beim MIDI die Oktaven genauso gestaltet. Und das obwohl ich schon die untersten zwei Oktaven, von meinen Anfängen, wieder ausgebaut hab ... das 8 Hz C der Subsubkontra-Oktave hörte ja eh kein Mensch mehr :mrgreen: [edit] jupp, eine crt.pas oder Ähnliches, hab ich nun auch schon gesucht, aber nicht gefunden |
Re: The Old-Style-Music-PLAY-Function
Zitat:
Zitat:
PS.: Crt.pas Das hilft aber nichts. Ab Win NT bekommt man keine Zugriffsrechte auf den Speakerport. Wenn man dos nimmt ist das kein Problem. Früher bei Win95 & Co ging das so: ![]() ![]()
Delphi-Quellcode:
Program Wave_To_Speaker;
uses dos, crt, ssystem; type WavHdr = record riff : array[1..4] of char; fsize : longint; wave : array[1..4] of char; fmt : array[1..4] of char; info16 : longint; info1 : integer; channel : integer; sampfreq: longint; bytesec : longint; bytesamp: integer; sampbit : integer; data : array[1..4] of char; seqsize : longint; end; const max = 64000; var buf : array [0..max] of byte; fh : file of byte; res, leng : word; n : word; hdr : wavhdr; procedure PlayPuffer; var i: Word; begin for i:=0 to leng do begin {if buf[i] > 128 then sound(hdr.sampfreq); nosound;} if buf[i] > 128 then sound(hdr.sampfreq + buf[i]) else nosound; delay(1); end; nosound; end; procedure readfile(filename: string; WaveInfo: Boolean); begin assign(f, filename); reset(f,1); blockread(f, hdr, sizeof(hdr), res); leng := hdr.seqsize; if leng > max then begin leng := max; Writeln('File to long!'); Writeln('Datei wurde von ', hdr.seqsize,' Byte auf ', leng,' Byte gekuerzt.'); end; blockread(f, buf, leng, res); Writeln(res, ' Byte gelesen!'); close(f); if WaveInfo then begin writeln('Dateiname : ',FileName); writeln('ID1 : ',hdr.riff); writeln('FileSize : ',hdr.fsize); writeln('ID2 : ',hdr.wave); writeln('ID3 : ',hdr.fmt); writeln('ID4 : ',hdr.info16); writeln('PCM-Format : ',hdr.info1); writeln('Kan„le : ',hdr.channel); writeln('Sampelrate : ',hdr.sampfreq); writeln('Byte pro Sec.: ',hdr.bytesec); writeln('Byte-Sample : ',hdr.bytesamp); writeln('Bit-Sample : ',hdr.sampbit); writeln('ID5 : ',hdr.data); writeln('SeqSize : ',hdr.seqsize); end; end; BEGIN ClrScr; readfile('D:\Wuhu.wav', true); PlayPuffer; END. |
Re: The Old-Style-Music-PLAY-Function
Das mit dem WAV-an-Speaker kenn ich noch.
Das hatte damals der Druckertreiber vom Lexmark gemacht ... die hatten viele (Fehler)Meldungen als Sprachausgabe und wenn es keine Soundkarte gab, dann nahmen sie diesen weg ... nur blöd, daß solange der PC still stand :lol: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz