Midi-Programm schreiben (Grundausführungen &so)

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Oliver90
Beiträge: 7
Registriert: 01.10.2009 18:50

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Oliver90 »

Hallo
bei mir funktionieren die beispiele nicht,bekomme ständig fehler meldungen in zeilen 37,38,55,56,60,61,62.Ich habe Pure Besic 4.30

MfG
Oliver
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Kiffi »

Oliver90 hat geschrieben:bei mir funktionieren die beispiele nicht,bekomme ständig fehler meldungen in zeilen 37,38,55,56,60,61,62.
Welche Beispiele genau?
Wie lauten die Fehlermeldungen?
Oliver90 hat geschrieben:Ich habe Pure Besic 4.30
<SCNR>musst Du PureBasic nehmen. Dann klappt's auch.</SCNR>

Grüße ... Kiffi
Oliver90
Beiträge: 7
Registriert: 01.10.2009 18:50

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Oliver90 »

Hallo Kiffi
Ich habe mit diesen Beispiel probleme

Code: Alles auswählen

Structure NotesGadget
  SAG.l     ;ScrollAreaGadget
  ImgG.l    ;ImageGadget
  IMG.l     ;Image
  width.l
  height.l
  Notes.s   ;String mit Noten (z.B. Alle meine Entchen "4cdef2gg4aaaa1g4aaaa1g4ffff2ee4gggg1c")
EndStructure
Global NewList _NotesGadget.NotesGadget()

Procedure NotesGadget(x.l, y.l, width.l, height.l, ScrollWidth.l, ScrollHeight.l)
  If AddElement(_NotesGadget())
    With _NotesGadget()
      \IMG = CreateImage(#PB_Any, ScrollWidth, ScrollHeight)
      StartDrawing(ImageOutput(\IMG))
        Box(0, 0, ScrollWidth, ScrollHeight, $FFFFFF)
      StopDrawing()
      If \IMG
        \SAG = ScrollAreaGadget(#PB_Any, x, y, width, height, ScrollWidth, ScrollHeight, 1)
        \ImgG = ImageGadget(#PB_Any, 0, 0, ScrollWidth, ScrollHeight, ImageID(\IMG))
        \width = ScrollWidth
        \height = ScrollHeight
       
        ProcedureReturn @NotesGadget()
      Else
        DeleteElement(_NotesGadget())
        ProcedureReturn #False
      EndIf
    EndWith
  EndIf
EndProcedure

Procedure SetNotes(*Gadget.NotesGadget, Notes.s)
  Protected z.s, length.l = -1, a.l, slength.l, pos.l = -1

  With *Gadget
   [color=#004080] \Notes = Notes[/color]    StartDrawing(ImageOutput(\IMG))
     [color=#008080] slength = Len(Notes)[/color]      For a = 1 To slength
        z = Mid(Notes, a, 1)
        If z >= "0" And z <= "9"
          length = Val(z)
        Else
          Select LCase(z)
            Case "c" : pos = 0
            Case "d" : pos = 1
            Case "e" : pos = 2
            Case "f" : pos = 3
            ;...
          EndSelect
          ;Mal Note mit DrawText()
        EndIf
      Next
    StopDrawing()
    SetGadgetState(\ImgG, ImageID(\IMG))
  EndWith
EndProcedure

Procedure FreeNotesGadget(*Gadget.NotesGadget)
  With *Gadget
    FreeGadget(\ImgG)
    FreeGadget(\SAG)
    FreeImage(\IMG)
    ChangeCurrentElement(_NotesGadget(), *Gadget)
    DeleteElement(_NotesGadget())
  EndWith
EndProcedure

;//////////////////////////////////////////////////////////////

Enumeration 0 ;/ #Window_*
  #Window_0
EndEnumeration

OpenWindow(#Window_0, 0, 0, 600/2, 480/2, "<title>", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(#Window_0))

*gadget.NotesGadget = NotesGadget(10, 10, 200, 150, 200, 150)
Debug *gadget

SetNotes(*gadget, "4cdef2gg4aaaa1g4aaaa1g4ffff2ee4gggg1c")

Define lWindowEvent.l
Repeat
  lWindowEvent = WaitWindowEvent()
  
  Select lWindowEvent
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver

FreeNotesGadget(*gadget)

End

Structure NotesGadget
  SAG.l     ;ScrollAreaGadget
  ImgG.l    ;ImageGadget
  IMG.l     ;Image
  width.l
  height.l
  Notes.s   ;String mit Noten (z.B. Alle meine Entchen "4cdef2gg4aaaa1g4aaaa1g4ffff2ee4gggg1c")
EndStructure
Global NewList _NotesGadget.NotesGadget()

Procedure NotesGadget(x.l, y.l, width.l, height.l, ScrollWidth.l, ScrollHeight.l)
  If AddElement(_NotesGadget())
    With _NotesGadget()
      \IMG = CreateImage(#PB_Any, ScrollWidth, ScrollHeight)
      StartDrawing(ImageOutput(\IMG))
        Box(0, 0, ScrollWidth, ScrollHeight, $FFFFFF)
      StopDrawing()
      If \IMG
        \SAG = ScrollAreaGadget(#PB_Any, x, y, width, height, ScrollWidth, ScrollHeight, 1)
        \ImgG = ImageGadget(#PB_Any, 0, 0, ScrollWidth, ScrollHeight, ImageID(\IMG))
        \width = ScrollWidth
        \height = ScrollHeight
       
        ProcedureReturn @NotesGadget()
      Else
        DeleteElement(_NotesGadget())
        ProcedureReturn #False
      EndIf
    EndWith
  EndIf
EndProcedure

Procedure SetNotes(*Gadget.NotesGadget, Notes.s)
  Protected z.s, length.l = -1, a.l, slength.l, pos.l = -1

  With *Gadget
    \Notes = Notes
    StartDrawing(ImageOutput(\IMG))
      slength = Len(Notes)
      For a = 1 To slength
        z = Mid(Notes, a, 1)
        If z >= "0" And z <= "9"
          length = Val(z)
        Else
          Select LCase(z)
            Case "c" : pos = 0
            Case "d" : pos = 1
            Case "e" : pos = 2
            Case "f" : pos = 3
            ;...
          EndSelect
          ;Mal Note mit DrawText()
        EndIf
      Next
    StopDrawing()
    SetGadgetState(\ImgG, ImageID(\IMG))
  EndWith
EndProcedure

Procedure FreeNotesGadget(*Gadget.NotesGadget)
  With *Gadget
    FreeGadget(\ImgG)
    FreeGadget(\SAG)
    FreeImage(\IMG)
    ChangeCurrentElement(_NotesGadget(), *Gadget)
    DeleteElement(_NotesGadget())
  EndWith
EndProcedure

;//////////////////////////////////////////////////////////////

Enumeration 0 ;/ #Window_*
  #Window_0
EndEnumeration

OpenWindow(#Window_0, 0, 0, 600/2, 480/2, "<title>", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(#Window_0))

*gadget.NotesGadget = NotesGadget(10, 10, 200, 150, 200, 150)
Debug *gadget

SetNotes(*gadget, "4cdef2gg4aaaa1g4aaaa1g4ffff2ee4gggg1c")

Define lWindowEvent.l
Repeat
  lWindowEvent = WaitWindowEvent()
  
  Select lWindowEvent
    Case #PB_Event_CloseWindow
      Break
  EndSelect
ForEver

FreeNotesGadget(*gadget)

End
bei zeile 37 steht:Invalid memory access(read error at adress 4294833381)
bei zeile 38 steht:The specified #Image is not initialized

MfG
Oliver
PS.
<SCNR>musst Du PureBasic nehmen
was ist das ?
bin neu bei PureBasic

--------- codetags ergänzt - bobobo
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Kiffi »

Hallo Oliver90,

wo hast Du den Code her? Aus diesem Board eher nicht, oder?

// Edit: Alles klar. Gefunden :oops:

Nach 'Säuberung' des Codes (so wie Du ihn gepostet hast, ist er
nicht lauffähig) bekomme auch ich einen IMA (invalid memory access).

Kann es sein, dass Du ihn falsch oder unvollständig kopiert hast?


<SCNR>musst Du PureBasic nehmen
was ist das ?
bin neu bei PureBasic
war nur ein alberner Seitenhieb auf Deinen Typo in "Pure Besic". Nicht so ersnt nehmen. ;-)

Grüße ... Kiffi
a²+b²=mc²
Oliver90
Beiträge: 7
Registriert: 01.10.2009 18:50

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Oliver90 »

Hallo Kiffi
dieses Beispiele ist vom diesen Thread von SimonSimCity
Kann es sein, dass Du ihn falsch oder unvollständig kopiert hast
,eigentlich nicht
war nur ein alberner Seitenhieb auf Deinen Typo in "Pure Besic". Nicht so ersnt nehmen
sorry,ist mir nicht aufgefallen

MfG
Oliver
PS.ich möchte so ein kleines Midi Programm schreiben,kannst Du mir Helfen ?
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Kiffi »

Oliver90 hat geschrieben:PS.ich möchte so ein kleines Midi Programm schreiben,kannst Du mir Helfen ?
so läuft es zumindest schon mal ohne Fehlermeldung:

Code: Alles auswählen

Structure NotesGadget
  SAG.l     ;ScrollAreaGadget
  ImgG.l    ;ImageGadget
  IMG.l     ;Image
  width.l
  height.l
  Notes.s   ;String mit Noten (z.B. Alle meine Entchen "4cdef2gg4aaaa1g4aaaa1g4ffff2ee4gggg1c")
EndStructure

Global NewList NotesGadget.NotesGadget()

Procedure xNotesGadget(x.l, y.l, width.l, height.l, ScrollWidth.l, ScrollHeight.l)
  If AddElement(NotesGadget())
    With NotesGadget()
      \IMG = CreateImage(#PB_Any, ScrollWidth, ScrollHeight)
      StartDrawing(ImageOutput(\IMG))
        Box(0, 0, ScrollWidth, ScrollHeight, $FFFFFF)
      StopDrawing()
      If \IMG
        \SAG = ScrollAreaGadget(#PB_Any, x, y, width, height, ScrollWidth, ScrollHeight, 1)
          \ImgG = ImageGadget(#PB_Any, 0, 0, ScrollWidth, ScrollHeight, ImageID(\IMG))
          \width = ScrollWidth
          \height = ScrollHeight
          
          ProcedureReturn @NotesGadget()
        Else
          DeleteElement(NotesGadget())
          ProcedureReturn #False
        EndIf
      EndWith
    EndIf
  EndProcedure
  
  Procedure SetNotes(*Gadget.NotesGadget, Notes.s)
    Protected z.s, length.l = -1, a.l, slength.l, pos.l = -1
    
    With *Gadget
      \Notes = Notes
      StartDrawing(ImageOutput(\IMG))
        slength = Len(Notes)
        For a = 1 To slength
          z = Mid(Notes, a, 1)
          If z >= "0" And z <= "9"
            length = Val(z)
          Else
            Select LCase(z)
              Case "c" : pos = 0
              Case "d" : pos = 1
              Case "e" : pos = 2
              Case "f" : pos = 3
                ;...
            EndSelect
            ;Mal Note mit DrawText()
          EndIf
        Next
      StopDrawing()
      SetGadgetState(\ImgG, ImageID(\IMG))
    EndWith
  EndProcedure
  
  Procedure FreeNotesGadget(*Gadget.NotesGadget)
    With *Gadget
      FreeGadget(\ImgG)
      FreeGadget(\SAG)
      FreeImage(\IMG)
      ChangeCurrentElement(NotesGadget(), *Gadget)
      DeleteElement(NotesGadget())
    EndWith
  EndProcedure
  
  
  Enumeration 0 ;/ #Window_*
    #Window_0
  EndEnumeration
  
  OpenWindow(#Window_0, 0, 0, 600/2, 480/2, "<title>", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  *Gadget.NotesGadget = xNotesGadget(10, 10, 200, 150, 200, 150)

  Debug *Gadget
  
  SetNotes(*Gadget, "4cdef2gg4aaaa1g4aaaa1g4ffff2ee4gggg1c")
  
  Define lWindowEvent.l
  
  Repeat
    lWindowEvent = WaitWindowEvent()
    
    Select lWindowEvent
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver
  
  FreeNotesGadget(*Gadget)
  
  End
Allerdings wird Dir das nur bedingt weiterhelfen, denn der wesentliche
Teil (das Zeichnen der Noten) ist gar nicht im Code vorhanden.

Es ging im wesentlichen darum, dass NTC einen kleinen Democode zur
Verfügung gestellt hat, in dem ein benutzerdefiniertes Gadget
(NotesGadget) erstellt wird.

Hier müsstest Du in der Zeile

Code: Alles auswählen

;Mal Note mit DrawText()
Deinen Code selber schreiben.

Grüße ... Kiffi
a²+b²=mc²
Oliver90
Beiträge: 7
Registriert: 01.10.2009 18:50

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Oliver90 »

Hallo Kiffi
Programm läuft jetzt ohne fehlermeldung,aber wenn ich das Programm starte, kann ich keine Midi Datei öffnen :cry:

MfG
Oliver
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Kiffi »

Oliver90 hat geschrieben:Programm läuft jetzt ohne fehlermeldung,aber wenn ich das Programm starte, kann ich keine Midi Datei öffnen :cry:
ja, das ist so OK. Denn der Code macht nichts anderes, als
ein Grundgerüst zur Verfügung zu stellen, um Midi-Noten darzustellen.

Es ist nicht dafür gedacht, Midi in irgendeiner Form abzuspielen.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von bobobo »

bei mal ";Mal Note mit DrawText()" kannst du mal

Code: Alles auswählen

drawtext(a*10,80-pos*10,z)
eingeben, damit du mal siehst was da im programm eigentlich verzapft wird.

und mach das xNodegadget etwas größer (die Breite des darzustellenden xNodegadgets ist
abhängig von der Anzahl der darzustellenden Noten).

Code: Alles auswählen

xNotesGadget(10, 10, 280, 220, 600, 300)
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Oliver90
Beiträge: 7
Registriert: 01.10.2009 18:50

Re: Midi-Programm schreiben (Grundausführungen &so)

Beitrag von Oliver90 »

Hallo Kiffi
Es ist nicht dafür gedacht, Midi in irgendeiner Form abzuspielen
das möchte ich nicht,ich möchte ein kleines Midi-Editor schreiben der mir die Noten(Tonhöhe & Tonlänge)zeigt,einzigste Problem den ich habe ist:ich weiß nicht,wie kann ich eine Midi-Datei öffnen und die Byts im Hex-Format anzeigen

MfG
Oliver
Antworten