Seite 2 von 3

Verfasst: 28.05.2005 16:17
von bluejoke
Nein, dann wird das zu komplex - einstimmig sollte meiner Meinung nach reichen.

Es wäre krass, wenn jemand ein Programm schreibt, dass lernt, also "das klingt gut" und "das klingt nicht gut" (für längere Abschnitte, so ein paar Noten) - oder sogar Stimmungen (von 2 hintereinanderfolgenden Tönen - melancholisch, u.s.w.) und die dann auch Einsetzen kann.

Verfasst: 28.05.2005 17:12
von Danilo
bluejoke hat geschrieben:Nein, dann wird das zu komplex - einstimmig sollte meiner Meinung nach reichen.
Wenn man allen ein paar Prozeduren dafür zur Verfügung stellt,
dann sollte MIDI kein Problem sein.
Dann braucht man nur noch PlayNote(kanal, Note) aufrufen.

Prozeduren dafür hab ich im: MIDI_Painter.zip, Datei INCLUDE\PureMIDI.pb

Dieses Include könnte man als Standard nehmen. Auch die
Hauptdatei "Sequenzer.pb" könnte man so nehmen.
Der Entwickler liefert so selbst nur eine Include mit der Funktion
main() die aufgerufen wird.
So ist der Setup-Dialog zur Auswahl des MIDI-Devices schon
alles da, man braucht nur noch einen Generator für PlayNote()
schreiben.

Was in Main() dann passiert ist komplett Sache des Entwicklers.
Ob er eine Console öffnet, ein Fenster oder einen Screen, etc..
jeder sollte ab Main() komplette Freiheit haben. So kommen wenigstens
viele unterschiedliche Ergebnisse raus.

Verfasst: 05.06.2005 12:43
von AndyX
Hab mal was ausgegraben und verändert: :lol:

Code: Alles auswählen

Structure WAVE
wFormatTag.w
nChannels.w
nSamplesPerSec.l
nAvgBytesPerSec.l
nBlockAlign.w
wBitsPerSample.w
cbSize.w
EndStructure

Enumeration
  #Sound_Sin
  #Sound_Distort
  #Sound_Guitar
  #Sound_Modem
EndEnumeration

Procedure GenSFX(nr,Frequency, Duration,Mode);
  SoundValue.b
  w.f
  
  #Mono = $0001
  #SampleRate = 11025
  #RiffId$ = "RIFF"
  #WaveId$ = "WAVE"
  #FmtId$ =  "fmt "
  #DataId$ = "data"
  #pi = 3.1415

  WaveFormatEx.WAVE
  WaveFormatEx\wFormatTag = #WAVE_FORMAT_PCM
  WaveFormatEx\nChannels = #Mono
  WaveFormatEx\nSamplesPerSec = #SampleRate
  WaveFormatEx\wBitsPerSample = $0008
  WaveFormatEx\nBlockAlign = (WaveFormatEx\nChannels * WaveFormatEx\wBitsPerSample) / 8
  WaveFormatEx\nAvgBytesPerSec = WaveFormatEx\nSamplesPerSec * WaveFormatEx\nBlockAlign
  WaveFormatEx\cbSize = 0
 
  DataCount = (Duration * #SampleRate)/1000
  RiffCount = 4 + 4 + 4 + SizeOf(WAVE) + 4 + 4 + DataCount
 
  start=AllocateMemory(RiffCount+100)
  MS=start
 
  PokeS(MS,#RiffId$):MS+4
  PokeL(MS,RiffCount):MS+4
  PokeS(MS,#WaveId$):MS+4
  PokeS(MS,#FmtId$):MS+4
  TempInt = SizeOf(WAVE)
  PokeL(MS,TempInt):MS+4
 
  PokeW(MS,WaveFormatEx\wFormatTag):MS+2
  PokeW(MS,WaveFormatEx\nChannels):MS+2
  PokeL(MS,WaveFormatEx\nSamplesPerSec):MS+4
  PokeL(MS,WaveFormatEx\nAvgBytesPerSec):MS+4
  PokeW(MS,WaveFormatEx\nBlockAlign):MS+2
  PokeW(MS,WaveFormatEx\wBitsPerSample):MS+2
  PokeW(MS,WaveFormatEx\cbSize):MS+2
 
  PokeS(MS,#DataId$):MS+4
  PokeL(MS,DataCount):MS+4
 
  w = 2 * #pi * Frequency
  For i = 0 To DataCount - 1
    Select Mode
      Case #Sound_Distort
        SoundValue = 127 + 32 * Sin(i * w / #SampleRate)*1.55*35
      Case #Sound_Modem
        SoundValue = 127 + 127 * Cos(i * w / #SampleRate)/Pow(Cos(#SampleRate),3)
      Case #Sound_Guitar
        SoundValue = 127 + 127 * Sin(i * w / #SampleRate)*1.55
      Case #Sound_Sin
        SoundValue = 127 + 127 * Sin(i * w / #SampleRate)
      EndSelect
   
   PokeB(MS,SoundValue):MS+1;
  Next
 
  CatchSound(nr,start)
EndProcedure

Procedure CloseSFX(nr)
  StopSound(nr)
  FreeSound(nr)
  FreeMemory(nr)
EndProcedure

Procedure DoSFX(nr,Mode)
  PlaySound(nr,Mode)
EndProcedure

If InitSound() = 0
  MessageRequester("Error", "Couldn´t init DirectX7 Sound!", #MB_OK|#MB_ICONERROR|#MB_SYSTEMMODAL)
EndIf

For i = 0 To 99
  GenSFX(i,Random(25)+25,Random(100)+38,2)
Next i

Procedure Furz(val)
  DoSFX(val,0)
  Beep_(Random(2022)+val,Random(10)+10)
  If GetAsyncKeyState_(#VK_ESCAPE)
    End
  EndIf
  Delay(90)
  Furz(Random(99))
EndProcedure

Furz(Random(99))

Verfasst: 05.06.2005 14:49
von NicTheQuick
@AndyX:
Du bist mir ja einer. :o

Ruft hier einfach die Funktion Furz() rekursiv auf bis es einen Stapelüberlauf gibt. :roll:

Verfasst: 05.06.2005 15:31
von AndyX
:lol: Also bei mir hab ich das 5 minuten laufen lassen und es is nix passiert :lol: :mrgreen: Außerdem kannste es ja eh beenden :D

Verfasst: 05.06.2005 16:58
von redacid
Ich hatte das vor einiger Zeit im alten Forum bereits erwähnt: für den Amiga gab es ein Programm, welches wirklich selbst komponieren konnte. Mehrstimmig. Einflussmöglichkeiten gab es auf Notenebene keine, nur welche Instrumente benutzt werden sollten und die Geschwindigkeit. Wenn ich mich richtig erinnere, war das alles.

Die Ergebnisse gingen von "grausam" bis "durchaus hörbar". Mit viel Glück war sogar ein "gut" drin. Die Idee gefiel mir als völlig unmusikalischem Nutzer natürlich trotzdem sehr gut - und auf dem PC (und erst recht Mac) habe ich so ein einfaches Programm bislang nicht gefunden. Ach so, das Programm hieß "Musiker" und konnte die erstellten Songs als MOD-Datei abspeichern.

Außerdem gab es noch "Algomusic", welches im Hintergrund lief und permanent per Algorithmus Musik abspielte. Diese war eher Techno-geprägt, glaube ich. Ist schon zu lange her, aber die Musik gefiel mir vom Stil er nicht, obwohl es teilweise auch sehr melodisch und relativ professionell klang. Abspeichern konnte man die Songs, so glaube ich, aber nicht.

Ein solcher Wettbewerb könnte mir auch gefallen - allerdings nur wegen der erhofften Ergebnisse...

Es gab da mal was

Verfasst: 30.04.2006 18:54
von Xaby
:mrgreen: Ich bin ja nun nicht so der Bringer, wenn es um das Programmieren an sich geht. :(
Meine Stärken liegen da eher wo anders ...
Naja wie auch immer, ich werd bei Gelegenheit mal mein ,,MusikMaker,, vorstellen.

Übrigens der MagixMusikMaker 7 hat so eine MusikMachFunktion.

Man gibt an, welche Genre, vielleicht noch die BPM-Zahl und die Länge des Stückes.

Der kramt dann aus seinen Samples welche zusammen, die die Vorgaben erfüllen und mixt sie zusammen.

Hört sich alles an, aber kommt an selbst gemachtes nicht heran.
Weil sich die sachen doch recht monoton und langweilig mit der Zeit anhören.
Aber wenn man schnell ne HintergrundMusik für ein Spiel braucht oder nicht recht eine Idee hat, wie sich was anhören könnte, kann man den Assistenten benutzen.
Naja und später kann man dann die einzelnen Samples ja noch nach genauen Vorstellungen anpassen.

/:->

Verfasst: 30.04.2006 22:01
von merlin
schaut euch einfach mal "fraktalmusik" an ;-)
denke das könnte euch schon weiterhelfen... viel spaß ^^

Verfasst: 01.05.2006 00:02
von Macros
Ich halte die Sache auch für eine sehr gute Idee.

Gibts denn nun einen Wettbewerb?

Verfasst: 02.05.2006 09:10
von Xaby
Oder doch lieber Just for Fun :D

Ich hatte schon lang mit einem MusikMachProgramm geliebeugelt.
Es gab in den früheren Versionen von Basic (QW-Basic, BasicA, Q-Basic)
Einen Befehl, der nannte sich

PLAY ("") :o
http://de.wikipedia.org/wiki/GWBasic
Der konnte Musik abspielen. Sowas gab's in TurboPascal nicht, fand ich schade und traurig. Hatte mich deshalb rangesetzt und das für Pascal als UNIT geschrieben. Hatte mich schon lange gefragt, ob es sowas nicht auch in PureBasic gibt oder ob der Bedarf einfach zu gering ist, weil es WAVE, MOD und MIDI eh schon gibt und das immer besser klingt.

Naja, ich hab's gestern Nacht in Pure umgeschrieben. :shock:
Ist noch nicht perfekt.
Aber in der Theorie steckt eine Menge Potential dahinter.

Funktioniert und klingt ähnlich wie die ersten Composer auf den NOKIAs.

/:-> Im Prinzip könnte man die NOKIA-Klingeltöne auch überlagern und dadurch Polyphone haben :mrgreen:

Wenn man die Wellen noch etwas verzerrt, bekommt man verschiedene Instrumente, so wie die Yamaha und Atari Chips auf SEGA und Konsorten :o

Wenn ich zu komme und ihr meinen MusikMacher sehen wollt, setz ich ihn heute abend rein. Wenn nicht, lass ich ihn vergammeln. :(

Könnt dann auch gern noch mit weiter dran basteln. Da steckt wirklich viel Potential hinter. MIDI-Export, MOD-Export, WAVE-Export
Speicherung im eigenen für Menschen lesbaren Format.
Ausgabe über PC-Speaker, PC-Lautsprecher(WAVE), oder das angeschlossene Keyboard(MIDI)

Weiterverarbeitung in externen Editoren.

OnTheFly-MusicRenderer 8)

Eigentlich ist es ein Interpreter. Das einzige Problem, was mein Programm noch aufweist, dass es nicht irgendwie im Hintergrund laufen kann. Weil ich es doch recht einfach gestaltet habe.
Ich benutze für die Pausen ein Delay :cry:

Aber ich bin ja auch nur der, der hier die Ideen liefert, das richtige programmieren überlasse ich anderen. :)

Vielleicht war meine Mühe auch umsonst und es gibt schon längst eine USER-Lib, die das alles kann und noch viel besser /:->

Auf jeden Fall ist es damit wesentlich einfacher einen ZufallsLied zu komponieren, dass sich noch anhöert. Und es kann bei Bedarf ohne Probleme gespeichert werden. Es muss eigentlich nur ein ZufallsSTRING
erzeugt werden.
http://delphi.icm.edu.pl/ftp/d10free/bleepint.htm

Na? :shock: Neugierig geworden? Bei genügend Anfragen, stell ich das Ding heute abend mal vor. 8)

Freue mich auf eure Antworten, Xaby