AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte The Old-Style-Music-PLAY-Function
Thema durchsuchen
Ansicht
Themen-Optionen

The Old-Style-Music-PLAY-Function

Ein Thema von himitsu · begonnen am 11. Nov 2009 · letzter Beitrag vom 19. Nov 2009
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von himitsu
himitsu
Registriert seit: 11. Okt 2003
Hiiiiihooo,

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.


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.

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.
Delphi-Quellcode:
// 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');
Gut, es ist jetzt vielleicht nicht gerade eine super High-Tech-Funktion,
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.
Code:
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
Hier ist also praktisch alles drinnen, was QBasic auch schon konnte.

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
Angehängte Dateien
Dateityp: dpr playproject_341.dpr (5,9 KB, 50x aufgerufen)
Dateityp: exe playproject_856.exe (43,0 KB, 66x aufgerufen)
Dateityp: exe demo_459.exe (20,0 KB, 70x aufgerufen)
Dateityp: zip play_106.zip (62,1 KB, 57x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
 
Medium

 
Delphi 2007 Enterprise
 
#21
  Alt 19. Nov 2009, 08:20
Haufenweise Versionen für diverse Linuxe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#22
  Alt 19. Nov 2009, 09:27
Gibt es eigentlich einen Kompilerschalter zur FreePascal-Delphi-Unterscheidung?

Und ich hab den Anhang mal durch 'ne Zip ersetzt.
  Mit Zitat antworten Zitat
Teekeks

 
FreePascal / Lazarus
 
#23
  Alt 19. Nov 2009, 17:58
@himitsu: du könntest auf jedenfall darauf prüfen, ob das linux ist, wenn ja: dann kans kein Delphi sein {ifdef UNIX}
Peter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#24
  Alt 19. Nov 2009, 18:47
OK, dann nehm ich mal das UNIX und baue deine Änderungen aus Post #2 ein.

Die vergessene Sache mit der Groß-/Kleinschreibung (#19 ganz unten) ist nun auch drinnen.

Ja und das Ganze betrifft jetzt erstmal nur die eine/beiden "Standard"-Funktion(en).
Delphi-Quellcode:
Function Play (Command: String): Integer;
Procedure CheckedPlay(Command: String);
> Anhang (Play.zip) im ersten Post ist geändert.
  Mit Zitat antworten Zitat
Teekeks

 
FreePascal / Lazarus
 
#25
  Alt 19. Nov 2009, 19:40
die Unit MMSystem existiert unter Lazarus nicht → Ich muss mir was einfallen lassen...
Hat jemand eine Idee wie ich sonst MIDI benutzen kann?
Peter
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#26
  Alt 19. Nov 2009, 19:52
von der MMSystem wird aktuell all Dieses verwendet
Delphi-Quellcode:
Type HMIDIOUT = Integer;
  PHMIDIOUT = ^HMIDIOUT;
  MMRESULT = UINT;

Const MIDI_MAPPER = UINT(-1);
  MM_MOM_OPEN = $3C7;
  MM_MOM_CLOSE = $3C8;
  MM_MOM_DONE = $3C9;
  MM_MOM_POSITIONCB = $3CA;
  CALLBACK_FUNCTION = $00030000;
  MMSYSERR_NOERROR = 0;
  MMSYSERR_BADERRNUM = 9;
  MMSYSERR_INVALPARAM = 11;
  MAXERRORLENGTH = 128;

Function midiOutOpen(lphMidiOut: PHMIDIOUT; uDeviceID: UINT;
  dwCallback, dwInstance, dwFlags: DWORD): MMRESULT; StdCall;
  External 'winmm.dllName 'midiOutOpen';
Function midiOutClose(hMidiOut: HMIDIOUT): MMRESULT; StdCall;
  External 'winmm.dllName 'midiOutClose';
Function midiOutShortMsg(hMidiOut: HMIDIOUT; dwMsg: DWORD): MMRESULT; StdCall;
  External 'winmm.dllName 'midiOutShortMsg';
Function midiOutGetVolume(hmo: HMIDIOUT; lpdwVolume: PDWORD): MMRESULT; StdCall;
  External 'winmm.dllName 'midiOutGetVolume';
Function midiOutGetErrorText(mmrError: MMRESULT; pszText: {PChar}PAnsiChar;
  uSize: UINT): MMRESULT; StdCall;
  External 'winmm.dllName 'midiOutGetErrorTextA';
Zum Testen der "alten" Funktionen kannst du ja auch erstmal die Klasse auskommentieren.

Die Funktionalität des MIDI wird ja durch die Soundkarte bereitgestellt, also dürfte es für Linux auch irgendeinen Weg ('ne API) zur Soundkarte geben.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz