Media Player [Windows]

Share your advanced PureBasic knowledge/code with the community.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4637
Joined: Sun Apr 12, 2009 6:27 am

Media Player [Windows]

Post by RASHAD »

Based on DirectShow 1.3 by Inc
- Capture Frames without pause
- Resize with respect to Aspect Ratio
- Move by no.of frames forward or backward
And many more

Part #1

Code: Select all

Global hwnd,hwnd_1,TTime.d,Frames,OldPos,im,Vol,fps,Run,Result,Media
im = 100

UseJPEGImageEncoder()
UsePNGImageEncoder()


#TBS_TOOLTIPS         = $0100
#CAPTUREBLT           = $40000000

#S_OK  = 0
#OATRUE = -1
#OAFALSE = 0

#CLSCTX_INPROC_SERVER  = $01
#CLSCTX_INPROC_HANDLER = $02
#CLSCTX_LOCAL_SERVER   = $04
#CLSCTX_REMOTE_SERVER  = $10

#CLSCTX_ALL    = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
#CLSCTX_INPROC = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER
#CLSCTX_SERVER = #CLSCTX_INPROC_SERVER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER

#MAX_FILTER_NAME = 128

#WM_GRAPHEVENT = #WM_USER+1

#EC_COMPLETE  = 1

#VMRMode_Windowed   = $1
#VMRMode_Windowless = $2
#VMRMode_Renderless = $4 
#VMRMode_Mask       = $7

#RenderPrefs_ForceOffscreen               = $00000001
#RenderPrefs_ForceOverlays                = $00000002
#RenderPrefs_AllowOverlays                = $00000000
#RenderPrefs_AllowOffscreen               = $00000000
#RenderPrefs_DoNotRenderColorKeyAndBorder = $00000008
#RenderPrefs_RestrictToInitialMonitor     = $00000010
#RenderPrefs_PreferAGPMemWhenMixing       = $00000020
#RenderPrefs_Mask                         = $0000003F

;{ Flag options / renderers
#Default = 0

#VMR9_Windowed       = 1 << 0     
#VMR9_Windowless     = 1 << 1
#VMR7_Windowed       = 1 << 2
#VMR7_Windowless     = 1 << 3
#OldVideoRenderer    = 1 << 4     
#OverlayMixer        = 1 << 5

#WaveOutRenderer     = 1 << 6
#DirectSoundRenderer = 1 << 7 

#VMR7_ForceOverlays  = 1 << 8
#VMR7_ForceOffscreen = 1 << 9
#DontKeepAR          = 1 << 10
;}

Enumeration ; MediaState
  #State_Stopped
  #State_Paused
  #State_Running
EndEnumeration

Enumeration ; MediaInfo
  #MEDIA_LENGTH
  #MEDIA_FPS
  #MEDIA_WIDTH
  #MEDIA_HEIGHT
  #MEDIA_POSITION
  #MEDIA_ASPECTRATIO_NUM
  #MEDIA_ASPECTRATIO_DEN
  #MEDIA_ASPECTRATIO
  #MEDIA_STATE
  #MEDIA_TIME_FRAMES
  #MEDIA_TIME_MSECS
EndEnumeration


Enumeration ; MediaSeeking
  #AM_SEEKING_NoPositioning        
  #AM_SEEKING_AbsolutePositioning
EndEnumeration

Interface IGraphBuilder_forceUnicode
  QueryInterface(a, b)
  AddRef()
  Release()
  AddFilter(a, b.p-unicode)
  RemoveFilter(a)
  EnumFilters(a)
  FindFilterByName(a.p-unicode, b)
  ConnectDirect(a, b, c)
  Reconnect(a)
  Disconnect(a)
  SetDefaultSyncSource()
  Connect(a, b)
  Render(a)
  RenderFile(a.p-unicode, b)
  AddSourceFilter(a.p-unicode, b.p-unicode, c)
  SetLogFile(a)
  Abort()
  ShouldOperationContinue()
EndInterface

Structure Dshow_Interfaces
  Object.l
  pGraphBuilder.IGraphBuilder_forceUnicode
  pControl.IMediaControl
  pEvent.IMediaEventEx
  pWindow.IVideoWindow
  pAudio.IBasicAudio
  pVideo.IBasicVideo2
  pSeeking.IMediaSeeking
  pMediaPosition.IMediaPosition
  pSampleGrabber.ISampleGrabber
  thread.l
  fullscreen.l
  hwnd.i
  drain.l
  aspectRatio.f
  width.l
  widthPAR.l
  height.l
  renderer.l
EndStructure

CompilerIf Defined(FILTER_INFO, #PB_Structure) = #False
  Structure FILTER_INFO ; an official Dshow structure - actually missing in PB
    achName.w[#MAX_FILTER_NAME]
    *pGraph.IFilterGraph 
  EndStructure
CompilerEndIf

CompilerIf Defined(CAUUID, #PB_Structure) = #False
  Structure CAUUID
    cElems.l
    *pElems  
  EndStructure
CompilerEndIf


CompilerIf Defined(IEnumFilters, #PB_Interface) = #False
  Interface IEnumFilters
    QueryInterface(a, b)
    AddRef()
    Release()
  Next(a, b, c)
    Skip(a)
    Reset()
    Clone(a)
  EndInterface
CompilerEndIf

Macro FAILED(Status)
  Status < 0
EndMacro

Macro SUCCEEDED(Status)
  Status >= 0
EndMacro

Macro _SafeRelease(__Object)
  If __Object
    __Object\Release()
    __Object = #Null
  EndIf 
EndMacro

Macro _GetMediaObject(_Object_)
  Protected _Object_#.Dshow_Interfaces = Object_GetObject(g_DshowObjects, Object)
  If Not _Object_#
    ;Debug "Fatal Error: The given media no. hasn't been initialized!"
    ;CallDebugger
    ProcedureReturn #False
  EndIf
EndMacro

Macro CHECK_(in)
  CompilerIf #PB_Compiler_Debugger
    If Not SUCCEEDED(in#)
      ;Debug "Not succeeded at line " + Str(#PB_Compiler_Line)
      ;CallDebugger
    EndIf
  CompilerElse
    in#
  CompilerEndIf
EndMacro

Macro DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  Global name.GUID
  name\Data1 = l
  name\Data2 = w1
  name\Data3 = w2
  name\Data4[0] = b1
  name\Data4[1] = b2
  name\Data4[2] = b3
  name\Data4[3] = b4
  name\Data4[4] = b5
  name\Data4[5] = b6
  name\Data4[6] = b7
  name\Data4[7] = b8
EndMacro

;{ GUIDS
DEFINE_GUID(IID_IGraphBuilder,          $56A868A9, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaControl,          $56A868B1, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaEventEx,          $56A868C0, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaSeeking,          $36B73880, $C2C8, $11CF, $8B, $46, $00, $80, $5F, $6C, $EF, $60)
DEFINE_GUID(IID_IMediaPosition,         $56a868b2, $0ad4, $11ce, $b0, $3a, $00, $20, $af, $0b, $a7, $70)
DEFINE_GUID(IID_IVideoWindow,           $56A868B4, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IBasicAudio,            $56A868B3, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IBasicVideo,            $56A868B5, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
;DEFINE_GUID(IID_IMediaSeeking,          $36B73880, $C2C8, $11CF, $8B, $46, $00, $80, $5F, $6C, $EF, $60)
DEFINE_GUID(IID_IBaseFilter,            $56A86895, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IVMRFilterConfig9,      $5A804648, $4F66, $4867, $9C, $43, $4F, $5C, $82, $2C, $F1, $B8)
DEFINE_GUID(IID_IVMRWindowlessControl9, $8F537D09, $F85E, $4414, $B2, $3B, $50, $2E, $54, $C7, $99, $27)
DEFINE_GUID(IID_IVMRFilterConfig,       $9E5530C5, $7034, $48B4, $BB, $46, $0B, $8A, $6E, $FC, $8E, $36)
DEFINE_GUID(IID_IVMRWindowlessControl,  $0EB1088C, $4DCD, $46F0, $87, $8F, $39, $DA, $E8, $6A, $51, $B7)
DEFINE_GUID(IID_IVMRAspectRatioControl, $EDE80B5C, $BAD6, $4623, $B5, $37, $65, $58, $6C, $9F, $8D, $FD)
DEFINE_GUID(IID_IVMRAspectRatioControl9,$00D96C29, $BBDE, $4EFC, $99, $01, $BB, $50, $36, $39, $21, $46)
DEFINE_GUID(IID_ISpecifyPropertyPages,  $B196B28B, $BAB4, $101A, $B6, $9C, $00, $AA, $00, $34, $1D, $07)
DEFINE_GUID(IID_IUnknown,               $00000000, $0000, $0000, $C0, $00, $00, $00, $00, $00, $00, $46)

DEFINE_GUID(IID_IDvdGraphBuilder,       $FCC152B6, $F372, $11D0, $8E, $00, $00, $C0, $4F, $D7, $C0, $8B)
DEFINE_GUID(IID_IDvdControl2,           $33BC7430, $EEC0, $11D2, $82, $01, $00, $A0, $C9, $D7, $48, $42)
DEFINE_GUID(IID_IDvdInfo2,              $34151510, $EEC0, $11D2, $82, $01, $00, $A0, $C9, $D7, $48, $42)

DEFINE_GUID(CLSID_FilterGraph,          $E436EBB3, $524F, $11CE, $9F, $53, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(CLSID_VideoMixingRenderer,  $B87BEB7B, $8D29, $423F, $AE, $4D, $65, $82, $C1, $01, $75, $AC)
DEFINE_GUID(CLSID_VideoMixingRenderer9, $51B4ABF3, $748F, $4E3B, $A2, $76, $C8, $28, $33, $0E, $92, $6A)
DEFINE_GUID(CLSID_OverlayMixer,         $CD8743A1, $3736, $11D0, $9E, $69, $00, $C0, $4F, $D7, $C1, $5B)
DEFINE_GUID(CLSID_VideoRenderer,        $70E102B0, $5556, $11CE, $97, $C0, $00, $AA, $00, $55, $59, $5A)
DEFINE_GUID(CLSID_AudioRender,          $E30629D1, $27E5, $11CE, $87, $5D, $00, $60, $8C, $B7, $80, $66)
DEFINE_GUID(CLSID_DSoundRender,         $79376820, $07D0, $11CF, $A2, $4D, $00, $20, $AF, $D7, $97, $67)
DEFINE_GUID(TIME_FORMAT_MEDIA_TIME,     $7B785574, $8C82, $11CF, $BC, $0C, $00, $AA, $00, $AC, $74, $F6)
DEFINE_GUID(TIME_FORMAT_FRAME,          $7B785570, $8C82, $11CF, $BC, $0C, $00, $AA, $00, $AC, $74, $F6)
;}

Import "ObjectManager.lib"
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    Object_GetOrAllocateID(*Objects, Object.l) As "_PB_Object_GetOrAllocateID@8"
    Object_GetObject(*Objects, Object.l) As "_PB_Object_GetObject@8"
    Object_IsObject(*Objects, Object.l) As "_PB_Object_IsObject@8"
    Object_FreeID(*Objects, Object.l) As "_PB_Object_FreeID@8"
    Object_Init(structuresize.l, IncrementStep.l, *ObjectFreeFunction) As "_PB_Object_Init@12"
  CompilerElse
    Object_GetOrAllocateID(*Objects, Object.l) As "PB_Object_GetOrAllocateID"
    Object_GetObject(*Objects, Object.l) As "PB_Object_GetObject"
    Object_IsObject(*Objects, Object.l) As "PB_Object_IsObject"
    Object_FreeID(*Objects, Object.l) As "PB_Object_FreeID"
    Object_Init(structuresize.l, IncrementStep.l, *ObjectFreeFunction) As "PB_Object_Init"
  CompilerEndIf
EndImport:IsWindow(#PB_Any)

Global g_DshowObjects.l
Global NewList filters.s()


Procedure GetFilterProperties(Object.l, filterName.s)
  _GetMediaObject(*object)  
  Protected *pFilter.IBaseFilter, *pProp.ISpecifyPropertyPages, FilterInfo.FILTER_INFO, *pFilterUnk.IUnknown, caGUID.CAUUID
  If *object\pGraphBuilder\FindFilterByName(filterName,  @*pFilter) = #S_OK ;: Debug "1"
    If *pFilter\QueryInterface(@IID_ISpecifyPropertyPages, @*pProp) = #S_OK ;: Debug "2"
      *pFilter\QueryFilterInfo(@FilterInfo) ;: Debug "3"
      *pFilter\QueryInterface(@IID_IUnknown, @*pFilterUnk) ;: Debug "4"
      *pProp\GetPages(@caGUID) ;: Debug "5"
      *pProp\Release() ;: Debug "6"
      OleCreatePropertyFrame_(*object\hwnd, 0, 0, @FilterInfo\achName, 1, @*pFilterUnk, caGUID\cElems, caGUID\pElems, 0, 0, #Null) ;: Debug "7"
      *pFilterUnk\Release()
      FilterInfo\pGraph\Release()
      CoTaskMemFree_(caGUID\pElems)
      ProcedureReturn #True
    EndIf
  EndIf 
EndProcedure

Procedure _DeleteInterfaces(Object.l)
  _GetMediaObject(*object)
  _SafeRelease(*object\pControl)
  _SafeRelease(*object\pEvent)
  _SafeRelease(*object\pWindow)
  _SafeRelease(*object\pAudio)
  _SafeRelease(*object\pVideo)
  _SafeRelease(*object\pSeeking)
  _SafeRelease(*object\pMediaPosition)
  ;_SafeRelease(*object\pSampleGrabber)
 ;_SafeRelease(*object\pGraphBuilder)

  ProcedureReturn #True
EndProcedure

Procedure _BuildInterfaces(Object.l)
  _GetMediaObject(*object)
  Protected a.l, b.l, c.l, d.l, e.l, f.l ,g.l,h.l
 If CoCreateInstance_(@CLSID_FilterGraph, #Null, #CLSCTX_INPROC_SERVER, @IID_IGraphBuilder, @*object\pGraphBuilder) <> #S_OK
    ;CoCreateInstance_(@CLSID_SampleGrabber, #Null, #CLSCTX_INPROC_SERVER, @IID_IBaseFilter, @*object\pSampleGrabber); <> #S_OK 
     ;Debug "Error: Couldn't initialize the GraphBuilder Interface"
     ;CallDebugger
     ProcedureReturn #False
   Else
    *object\Object = #True
    a = *object\pGraphBuilder\QueryInterface(@IID_IMediaControl, @*object\pControl)
    b = *object\pGraphBuilder\QueryInterface(@IID_IMediaEventEx, @*object\pEvent)
    c = *object\pGraphBuilder\QueryInterface(@IID_IVideoWindow,  @*object\pWindow)
    d = *object\pGraphBuilder\QueryInterface(@IID_IBasicAudio,   @*object\pAudio)
    e = *object\pGraphBuilder\QueryInterface(@IID_IBasicVideo,   @*object\pVideo)
    f = *object\pGraphBuilder\QueryInterface(@IID_IMediaSeeking, @*object\pSeeking)
    g = *object\pGraphBuilder\QueryInterface(@IID_IMediaPosition, @*object\pMediaPosition)    
    ;h = *object\pGraphBuilder\QueryInterface(@IID_ISampleGrabber, @*object\pSampleGrabber)
    If SUCCEEDED(a) And SUCCEEDED(b) And SUCCEEDED(c) And SUCCEEDED(d) And SUCCEEDED(e) And SUCCEEDED(f) And SUCCEEDED(g); And SUCCEEDED(h); Quick check
      ProcedureReturn #True
    Else
      _DeleteInterfaces(Object)
      ;Debug "Error: Query of at least one of the needed Interfaces failed"
      ;CallDebugger
      ProcedureReturn #False
    EndIf
  EndIf 
EndProcedure

Procedure ResizeMedia(Object.l, x.l, y.l, width.l, height.l , keepAR.l = #True)
  ;x = 8 : y = 8: width - 10 : height - 75
  _GetMediaObject(*object)
  If x > #PB_Default
    *object\pWindow\put_Left(x)
  EndIf
  If y > #PB_Default
    *object\pWindow\put_Top(y)
  EndIf
  If width > #PB_Default
    *object\pVideo\put_DestinationWidth(width)
    *object\pWindow\put_width(width)
    *object\width = width
  EndIf
  If height > #PB_Default
    If keepAR
      *object\pVideo\put_DestinationHeight(width/*object\aspectRatio)
      *object\pVideo\put_Destinationtop((height/2)-(width/*object\aspectRatio)/2)
    Else
      *object\pVideo\put_DestinationHeight(height)
      *object\pVideo\put_Destinationtop(0)
    EndIf 
    *object\pWindow\put_Height(height)
    *object\height = height
  EndIf
  ;BringWindowToTop_(*object\pWindow)
EndProcedure

Procedure LoadMedia(Object.l, filename.s, Parent=0, flags.l = #VMR7_Windowed)
  _GetMediaObject(*object)
  Protected pVmr.IBaseFilter, pVidRend.IBaseFilter, pAudR.IBaseFilter, pFilter.IBaseFilter
  Protected pEnum.IEnumFilters, pVMRCnfg.IVMRFilterConfig, pWc.IVMRWindowlessControl, PAR.IVMRAspectRatioControl
  Protected VMR.b, pIndividualRenderer, RendName.s, pFltrCnfg, pWndCntrl, pARControl, vw, vh, ax, ay, cFetched, ar.f
  Protected FilterInfo.FILTER_INFO
 
  ;Debug UCase(GetFilePart(filename))
 
;   If UCase(GetFilePart(filename)) = "VIDEO_TS.IFO"
;     ;Debug "yes"
;   EndIf
  _BuildInterfaces(Object)
  *object\renderer = 0
 
  If flags & #VMR9_Windowed Or flags & #VMR9_Windowless Or flags & #VMR7_Windowed Or flags & #VMR7_Windowless Or flags & #OldVideoRenderer Or flags & #OverlayMixer ;VidRenderer
    If flags & #VMR9_Windowed Or flags & #VMR9_Windowless
      *object\renderer | #VMR9_Windowed
      pIndividualRenderer = @CLSID_VideoMixingRenderer9 : RendName = "Video Mixing Renderer 9"
    ElseIf flags & #VMR7_Windowed Or flags & #VMR7_Windowless
      *object\renderer | #VMR7_Windowed
      pIndividualRenderer = @CLSID_VideoMixingRenderer  : RendName = "Video Mixing Renderer 7"
    ElseIf flags & #OverlayMixer
      *object\renderer | #OverlayMixer
      pIndividualRenderer = @CLSID_OverlayMixer         : RendName = "Overlay Mixer"
    ElseIf flags & #OldVideoRenderer
      *object\renderer | #OldVideoRenderer
      pIndividualRenderer = @CLSID_VideoRenderer        : RendName = "Old Video Renderer"
    EndIf
   
    If CoCreateInstance_(pIndividualRenderer, #Null, #CLSCTX_INPROC, @IID_IBaseFilter, @pVidRend) = #S_OK
      If *object\pGraphBuilder\AddFilter(pVidRend, RendName) = #S_OK
        VMR = #False
        If flags & #VMR9_Windowed Or flags & #VMR9_Windowless
          pFltrCnfg = @IID_IVMRFilterConfig9
          pWndCntrl = @IID_IVMRWindowlessControl9
          pARControl= @IID_IVMRAspectRatioControl9
          VMR = #True
        ElseIf flags & #VMR7_Windowed Or flags & #VMR7_Windowless
          pFltrCnfg = @IID_IVMRFilterConfig
          pWndCntrl = @IID_IVMRWindowlessControl
          pARControl= @IID_IVMRAspectRatioControl
          VMR = #True
        EndIf
        If VMR
          If pVidRend\QueryInterface(pFltrCnfg, @pVMRCnfg) = #S_OK
            If flags & #VMR9_Windowed Or flags & #VMR7_Windowed
              CHECK_(pVMRCnfg\SetRenderingMode(#VMRMode_Windowed))
              If flags & #VMR7_ForceOverlays
                CHECK_(pVMRCnfg\SetRenderingPrefs(#RenderPrefs_ForceOverlays))
              ElseIf flags & #VMR7_ForceOffscreen
                CHECK_(pVMRCnfg\SetRenderingPrefs(#RenderPrefs_ForceOffscreen))
              EndIf
              If flags & #DontKeepAR
                If pVidRend\QueryInterface(pARControl, @PAR) = #S_OK
                  CHECK_(PAR\SetAspectRatioMode(0))
                  PAR\Release()
                EndIf
              EndIf
            ElseIf flags & #VMR9_Windowless Or flags & #VMR7_Windowless
              CHECK_(pVMRCnfg\SetRenderingMode(#VMRMode_Windowless))
              If pVidRend\QueryInterface(@pWndCntrl, @pWc) = #S_OK And Parent
                CHECK_(pWc\SetVideoClippingWindow(Parent))
                CHECK_(pWc\SetAspectRatioMode(0))
                pWc\Release()
              EndIf
            EndIf
            pVMRCnfg\Release()
          Else
            ;Debug "Error: Getting Interface for VMR Config failed"
          EndIf
        EndIf
      Else
        ;Debug "Error: Adding Individual video render filter failed" 
      EndIf
      pVidRend\Release()
    Else
      ;Debug "Error: Couldn't Create Instance of individual video renderer"
    EndIf
  EndIf
 
  RendName = ""
  If flags & #WaveOutRenderer
    RendName = "AudioWaveOut Renderer"
    pIndividualRenderer = @CLSID_AudioRender
  ElseIf flags & #DirectSoundRenderer
    RendName = "DirectSound Renderer"
    pIndividualRenderer = @CLSID_DSoundRender
  EndIf
  If RendName
    If CoCreateInstance_(pIndividualRenderer, #Null, #CLSCTX_INPROC, @IID_IBaseFilter, @pAudR) = #S_OK
      If *object\pGraphBuilder\AddFilter(pAudR, RendName) = #S_OK
        pAudR\Release()
      Else
        ;Debug "Error: Adding Individual audio render filter failed"
      EndIf
    Else
      ;Debug "Error: Couldn't Create Instance of individual audio renderer"
    EndIf
  EndIf
  If *object\pGraphBuilder\RenderFile(filename, #Null) = #S_OK
   
    If Parent
      *object\hwnd = Parent
      *object\pVideo\get_SourceWidth(@vw)
      *object\pVideo\get_SourceHeight(@vh)
      *object\pVideo\GetPreferredAspectRatio(@ax, @ay)
     
      If ax And ay
        *object\aspectRatio = ax/ay
        *object\widthPAR = (vh * *object\aspectRatio); * 0.70
        vw = *object\widthPAR
        ;Debug "aspektRatio  : "+StrF(*object\aspectRatio,3)
        ;Debug "WidthPAR  : "+Str(vw)
      EndIf
     
      *object\width = vw
      *object\height = vh
      ResizeMedia(Object, 0, 0, vw, vh)
      CHECK_(*object\pWindow\put_Owner(*object\hwnd))
      CHECK_(*object\pWindow\put_WindowStyle(#WS_CHILD|#WS_CLIPSIBLINGS|#WS_CLIPCHILDREN))
      CHECK_(*object\pWindow\put_Visible(#OATRUE))
      UpdateWindow_(*object\hwnd)
      SetForegroundWindow_(*object\hwnd)
      SetFocus_(*object\hwnd)
    EndIf
   
    If *object\pEvent\SetNotifyWindow(Parent, #WM_GRAPHEVENT, Object.l) = #S_OK
      If *object\pEvent\SetNotifyFlags(0) <> #S_OK
      EndIf
    Else
      ;Debug "Info: Media notification callback has not been applied"
    EndIf
    If *object\pGraphBuilder\EnumFilters(@pEnum) = #S_OK
      ;Debug " "
      ;Debug "--------- Filtergraph ---------"
      While pEnum\Next(1, @pFilter, @cFetched) = #S_OK
      pFilter\QueryFilterInfo(@FilterInfo)
      AddElement(filters())
      ;Debug PeekS(@FilterInfo\achName, #MAX_FILTER_NAME, #PB_Unicode)
      filters() = PeekS(@FilterInfo\achName, #MAX_FILTER_NAME, #PB_Unicode)
      If FilterInfo\pGraph <> #Null
        FilterInfo\pGraph\Release()
      EndIf
      pFilter\Release()
    Wend
    ;Debug "--------------------------------------"
    ;Debug " "
  Else
    ;Debug "Error: Could not enumerate filters"
  EndIf
  *object\pSeeking\SetTimeFormat(@TIME_FORMAT_MEDIA_TIME)
  *object\pGraphBuilder\Release()

  ProcedureReturn #True
Else
  ;Debug "Error: Rendering file failed"
  ProcedureReturn #False
EndIf

EndProcedure

Procedure PutRate(Object.l,rate.f)
  _GetMediaObject(*object)
  ProcedureReturn *object\pMediaPosition\put_Rate(rate)
EndProcedure

Procedure PlayMedia(Object.l)
  _GetMediaObject(*object)
  ProcedureReturn *object\pControl\run()
EndProcedure

Procedure PauseMedia(Object.l)
  _GetMediaObject(*object)
  ProcedureReturn *object\pControl\pause()
EndProcedure

Procedure MediaSeek(Object.l, pos.q)
  _GetMediaObject(*object)
  Protected duration.q
  pos * 10000
  *object\pSeeking\GetDuration(@duration) 
  ProcedureReturn *object\pSeeking\SetPositions(@pos, #AM_SEEKING_AbsolutePositioning,@duration, #AM_SEEKING_NoPositioning)
EndProcedure

Procedure MediaStop(Object.l)
  _GetMediaObject(*object)
  ProcedureReturn *object\pControl\stop()
EndProcedure

Procedure MediaLenght(Object.l, mode.l)
  _GetMediaObject(*object)
  Protected duration.q, avgTimePerFrame.d
  *object\pSeeking\GetDuration(@duration)
  If mode = #MEDIA_TIME_MSECS
    ProcedureReturn duration/10000 
  ElseIf mode = #MEDIA_TIME_FRAMES
    *object\pVideo\get_AvgTimePerFrame(@avgTimePerFrame)
    If avgTimePerFrame > 0
      ProcedureReturn (duration/10000) / (avgTimePerFrame*1000)
    EndIf 
  EndIf
EndProcedure

Procedure MediaWidth(Object.l)
  _GetMediaObject(*object) 
  ProcedureReturn *object\width 
EndProcedure

Procedure MediaHeight(Object.l, height.l = #PB_Default)
  _GetMediaObject(*object)
  ProcedureReturn *object\height
EndProcedure

Procedure MediaPosition(Object.l, mode.l)
  _GetMediaObject(*object)
  Protected pos.q, avgTimePerFrame.d
  *object\pSeeking\GetCurrentPosition(@pos)
  If mode = #MEDIA_TIME_MSECS
    ProcedureReturn pos/10000 ; result in ms
  ElseIf mode = #MEDIA_TIME_FRAMES
    *object\pVideo\get_AvgTimePerFrame(@avgTimePerFrame)
    If avgTimePerFrame > 0
      ProcedureReturn (pos/10000) / (avgTimePerFrame*1000)
    EndIf
  EndIf 
EndProcedure

Procedure MediaState(Object.l)
  _GetMediaObject(*object)
  Protected pfs.l
  *object\pControl\GetState(10,@pfs)
  ProcedureReturn pfs
EndProcedure

Procedure.f MediaFPS(Object.l)
  _GetMediaObject(*object)
  Protected avgTimePerFrame.d
  *object\pVideo\get_AvgTimePerFrame(@avgTimePerFrame)
  If avgTimePerFrame > 0
    ProcedureReturn 1/avgTimePerFrame 
  Else
    ProcedureReturn #False
  EndIf 
EndProcedure

Procedure OnMediaEvent(Object.l)
  _GetMediaObject(*object)
  Protected EventCode.l, Param1.l, Param2.l
  While *object\pEvent\GetEvent(@EventCode, @Param1, @Param2, 0) <> #E_ABORT
    Select EventCode
      Case #EC_COMPLETE
        *object\pControl\stop() ; If an #EC_COMPLETE notify occurs we do change the media state to stopped
        ;Debug "... end has been reached."
    EndSelect
    *object\pEvent\FreeEventParams(EventCode, Param1, Param2)
  Wend
EndProcedure

Procedure.s MediaTime2String(time.l)
  Protected ti.s, SS, MM, HH, ms
  ms = time%1000
  SS = Int(time / 1000) : While SS > 59:SS-60:Wend 
  MM = Int(time / 1000 / 60) : While MM > 59:MM-60:Wend 
  HH = Int(time / 1000 / 60 / 60) : While HH > 59:HH-60:Wend
  ti.s =RSet(StrU(HH,2),2,"0")+":"+RSet(StrU(MM,2),2,"0")+":"+RSet(StrU(SS,2),2,"0")+":"+RSet(StrU(ms,2),3,"0")
  ProcedureReturn ti.s
EndProcedure

Procedure MediaGetVolume(Object.l) ; from -100db to 0db
  _GetMediaObject(*object) 
  Protected db.l
  *object\pAudio\get_Volume(@db)
  ProcedureReturn db/100 
EndProcedure

Procedure MediaPutVolume(Object.l, db.l) 
  _GetMediaObject(*object)
  If db > -85 And db < 1 
    Delay(10) : *object\pAudio\put_Volume(db*100)
  EndIf 
EndProcedure

Procedure MediaPutBalance(Object.l, bal.l)
  _GetMediaObject(*object)
  *object\pAudio\put_balance(bal*100)
EndProcedure

Procedure MediaGetBalance(Object.l)
  _GetMediaObject(*object)
  Protected bal
  *object\pAudio\get_balance(@bal)
  ProcedureReturn Int(bal/100)
EndProcedure

Procedure CloseMedia(Object.l)
  _GetMediaObject(*object)
  
  Protected pfs.l
  *object\pControl\GetState(10,@pfs)
  If Not pfs = #State_Stopped
    *object\pControl\stop()
  EndIf
  *object\pWindow\put_Visible(#OAFALSE)
  *object\pWindow\put_Owner(#OAFALSE)
  *object\pEvent\SetNotifyWindow(#Null, 0, 0)
  _DeleteInterfaces(Object)
  ClearList(filters())
  ProcedureReturn #True 
EndProcedure

Procedure FreeMedia(Object.l)
  If Object<>#PB_Any And Object_IsObject(g_DshowObjects, Object)
    _GetMediaObject(*object)
    Protected pfs.l
    If *object\pControl
      *object\pControl\GetState(10,@pfs)
      If Not pfs = #State_Stopped
        *object\pControl\stop()
      EndIf 
      CloseMedia(Object)
    EndIf
    CoUninitialize_()
    Object_FreeID(g_DshowObjects, Object)
    *object\Object = #False
    ProcedureReturn #True 
  EndIf
EndProcedure

Procedure InitMedia(Object.l)
  Protected *object.Dshow_Interfaces
  If Not g_DshowObjects
    g_DshowObjects = Object_Init(SizeOf(Dshow_Interfaces), 1, @FreeMedia())
  EndIf
  *object = Object_GetOrAllocateID(g_DshowObjects, Object)
  If *object
    *object\Object = #True
    CoInitializeEx_(0, $02); #COINIT_APARTMENTTHREADED
    ;CoInitialize_(0)
    ProcedureReturn #True
  Else
    ;Debug "Fatal Error: The given media no. hasn't been initialized!"
    ;CallDebugger
    ProcedureReturn #False
  EndIf 
EndProcedure

Procedure WndProc(hwnd, uMsg, wParam, lParam)
      result = #PB_ProcessPureBasicEvents 

 Select uMsg

   Case #WM_SIZE;,#WM_MOVE,#WM_PAINT
        If Run = 1; And MediaState(#Media) = #State_Running
          ResizeGadget(0,5, WindowHeight(0)-73, WindowWidth(0)-10,68)
          ResizeGadget(1,0, 0, WindowWidth(0)-10,22)
          ResizeWindow(1, 5, 5,WindowWidth(0)-10,WindowHeight(0)- 84)
          ResizeMedia(Media, 0, 0, WindowWidth(1), WindowHeight(1),GetGadgetState(16))
        Else                
          ResizeGadget(0,5, WindowHeight(0)-73, WindowWidth(0)-10,68)
          ResizeGadget(1,0, 0, WindowWidth(0)-10,22)
          ResizeWindow(1, 5, 5,WindowWidth(0)-10,WindowHeight(0)-84)
        EndIf
             
   EndSelect
   
  ProcedureReturn result 
EndProcedure

  CatchImage(0 , ?Mute3)
  CatchImage(1 , ?New2)
  CatchImage(2 , ?Nframe)
  CatchImage(3 , ?Pause2)
  CatchImage(4 , ?Play2)
  CatchImage(5 , ?Pframe)
  CatchImage(6 , ?Save)
  CatchImage(7 , ?Sound2)
  CatchImage(8 , ?Stop)
  CatchImage(9 , ?Max)
  CatchImage(10, ?Rest)
  
  ExamineDesktops()

  hwnd = OpenWindow(0,0,0,800,600,"PB native Dshow example",#PB_Window_BorderLess|#WS_THICKFRAME|#WS_BORDER|#PB_Window_ScreenCentered)
  SetWindowColor(0,$45D1FE)
  WindowBounds(0,800,600,#PB_Ignore,#PB_Ignore)
    
  ContainerGadget(0,5,527,790,68,#PB_Container_Flat)
  SetGadgetColor(0, #PB_Gadget_BackColor, $E3E3E3)
      TrackBarGadget     (1, 0, 0, 790, 22, 0, 10000,#TBS_FIXEDLENGTH)
      SendMessage_(GadgetID(1), #TBM_SETTHUMBLENGTH,20,0)  
      ButtonImageGadget  (2 ,2 ,28,32,32,ImageID(1))                ;Load
      GadgetToolTip(2,"New Media")
      ButtonImageGadget  (3 ,50,  32,24,24,ImageID(5))              ;Previous Frame
      GadgetToolTip(3,"Step Backward")
      SpinGadget         (4 ,75, 34,28,20,0,100,#PB_Spin_Numeric)   ;No. of Previos Frames
      GadgetToolTip(4,"No.of Frames to Step Backward")
      ButtonImageGadget  (5 ,112, 28,46,32,ImageID(4))               ;Play
      GadgetToolTip(5,"Play- Pause")
      SpinGadget         (6 ,165, 34,28,20,0,100,#PB_Spin_Numeric)  ;No. of Next Frames
      GadgetToolTip(6,"No.of Frames to Step Forward")
      ButtonImageGadget  (7,193, 32,24,24,ImageID(2))               ;Next Frame
      GadgetToolTip(7,"Step Forward")
      ButtonImageGadget  (8,530, 29,30,30,ImageID(6))               ;Save As
      GadgetToolTip(8,"Capture & Save Frame")
      TrackBarGadget     (9,300,24,70,16, 0, 25)                    ;Sound Volume
      GadgetToolTip(9,"Sound Volume")
      ButtonImageGadget  (10,230, 28,32,32,ImageID(7))              ;Sound Control
      GadgetToolTip(10,"Mute")
      ButtonImageGadget  (11,264, 28,32,32,ImageID(9))              ;Max - Min
      GadgetToolTip(11,"Maximize - Restore")
      ButtonImageGadget  (12,750, 29,32,32,ImageID(8))              ;Quit
      GadgetToolTip(12,"Quit")
      TrackBarGadget     (13,300,46,70,16,0, 20,#TBS_TOOLTIPS)      ;PlayBack Speed
      GadgetToolTip(13,"PlayBack Speed")
      
      ComboBoxGadget(14,376,22,140,20)
      GadgetToolTip(14,"Audio Mode")
      AddGadgetItem(14, -1, "WaveOutRenderer")
      AddGadgetItem(14, -1, "DirectSoundRenderer")
      
      ComboBoxGadget(15,376,43,120,20)
      GadgetToolTip(15,"Video Mode")
      AddGadgetItem(15, -1, "VMR9_Windowed")
      AddGadgetItem(15, -1, "VMR9_Windowless")
      AddGadgetItem(15, -1, "VMR7_Windowed")
      AddGadgetItem(15, -1, "VMR7_Windowless")
      AddGadgetItem(15, -1, "OldVideoRenderer")
      AddGadgetItem(15, -1, "OverlayMixer")
      AddGadgetItem(15, -1, "VMR7_ForceOverlays")
      AddGadgetItem(15, -1, "VMR7_ForceOffscreen")
      
      CheckBoxGadget(16,502,45,18,18,"",#PB_CheckBox_Center)
      GadgetToolTip(16,"Aspect Ratio")
      
      ComboBoxGadget(17,565,34,145,20)
      GadgetToolTip(17,"Save Image Format")
      AddGadgetItem(17, -1, "Use BMP ImageEncoder")
      AddGadgetItem(17, -1, "Use JPEG ImageEncoder")
      AddGadgetItem(17, -1, "Use PNG ImageEncoder")
  CloseGadgetList()
 
  SetGadgetState(4,1)
  SetGadgetState(6,1)
  SetGadgetState(9,25)
  SetGadgetState(13,10)
  
  SetGadgetState(14, 1)
  SetGadgetState(15, 2)
  
  SetGadgetState(16, 1)
  
  SetGadgetState(17, 2)
  
  SetGadgetItemData(14,0,1 << 6)
  SetGadgetItemData(14,1,1 << 7)
  
  SetGadgetItemData(15, 0, 1 << 0)
  SetGadgetItemData(15, 1, 1 << 1)
  SetGadgetItemData(15, 2, 1 << 2)
  SetGadgetItemData(15, 3, 1 << 3)
  SetGadgetItemData(15, 4, 1 << 4)
  SetGadgetItemData(15, 5, 1 << 5)
  SetGadgetItemData(15, 6, 1 << 6)
  SetGadgetItemData(15, 7, 1 << 8)
  SetGadgetItemData(15, 8, 1 << 9)
  SetGadgetItemData(15, 9, 1 << 10)

  
  hwnd_1 = OpenWindow(1,5,5,790,516,"PB native Dshow example",#PB_Window_BorderLess)
  SetWindowColor(1,#Black)
  SetParent_(WindowID(1),WindowID(0))
  
  SetWindowCallback(@WndProc())
    
  SetActiveWindow(0)
  AddWindowTimer(0, 125, 10)  
      
Repeat

  Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
            Quit = 1
       
      
      Case #PB_Event_Gadget
        Select EventGadget()
           Case 1  ;TrackBar
                  If Run = 1
                  If GetAsyncKeyState_(#VK_LBUTTON) > 0
                    SetGadgetAttribute(5,#PB_Button_Image,ImageID(4))              
                    PauseMedia(Media)  
                    MediaSeek(Media, (TTime.d/10000)*GetGadgetState(1))
                  ElseIf GetAsyncKeyState_(#VK_LBUTTON) = 0
                    SetGadgetAttribute(5,#PB_Button_Image,ImageID(3))
                    Play = 1
                    PlayMedia(Media)
                  EndIf
                  EndIf           
          
           Case 2  ;Load
                  Mode = GetGadgetItemData(15, GetGadgetState(15))|GetGadgetItemData(14, GetGadgetState(14))
                   If OSVersion() <= #PB_OS_Windows_Vista
                      Mode = #OldVideoRenderer|#DirectSoundRenderer ;#WaveOutRenderer ;#OverlayMixer|#DirectSoundRenderer ;
                   EndIf
                  If Run = 1
                    MediaSeek(Media,0)
                    CloseMedia(Media)
                    FreeMedia(Media)
                    SetGadgetAttribute(5,#PB_Button_Image,ImageID(4))
                    SetGadgetState(1,0)
                    Run = 0 :Play = 0 :Mute = 0 :Menu = 0
                  EndIf                  
  
                  File.s = OpenFileRequester("Choose media file","","All Files (*.*)|*.*",0)
                  If File <> ""
                      Cap$ = Left(GetFilePart(File), Len(GetFilePart(File))-Len(GetExtensionPart(File))-1)
      
                      InitMedia(Media)
                      
                      If IsLibrary(0)
                          *func=GetFunction(0,"DwmEnableComposition")
                          CallFunctionFast(*func,1) 
                          CloseLibrary(0)
                      EndIf
                                            
                      If OSVersion() >= #PB_OS_Windows_Vista And Mode & #OverlayMixer
                         Mode = Mode|#VMR7_Windowed &~ #OverlayMixer
                         OpenLibrary(0, "dwmapi.dll")
                         *func=GetFunction(0,"DwmEnableComposition")
                         CallFunctionFast(*func,0)
                      EndIf
                      
                      If (OSVersion() = #PB_OS_Windows_XP Or OSVersion() = #PB_OS_Windows_Server_2003) And Mode & #OverlayMixer
                        Mode = Mode|#VMR7_Windowed &~ #OverlayMixer
                      EndIf
                     
                      LoadMedia(Media, File, hwnd_1 ,Mode)
                      TTime.d = MediaLenght(Media, #MEDIA_TIME_MSECS)
                      Frames  = MediaLenght(Media, #MEDIA_TIME_FRAMES)
                      fps     = MediaFPS(Media)                            ;Frames*1000/TTime
                      If Frames <> 0 And fps <> 0
                          mWidth = MediaWidth(Media) : mHeight = MediaHeight(Media)
                          ResizeWindow(1, 5, 5,WindowWidth(0)-10,WindowHeight(0)- 84)
                          ResizeMedia(Media, 0, 0, WindowWidth(1), WindowHeight(1),#True)
                          Run = 1
                      Else
                        MessageRequester("Error","Can not load the movie !"+#CRLF$+"Check the Codecs",#MB_ICONERROR)
                          Run = 0
                      EndIf
                  EndIf
           
           Case 3   ;Pframe
                  If Run = 1
                  PauseMedia(Media)
                  For i = 1 To GetGadgetState(4)
                    MediaSeek(Media, MediaPosition(Media,#MEDIA_TIME_MSECS)-fps)
                    If MediaPosition(Media,#MEDIA_TIME_FRAMES) = OldPos
                      MediaSeek(Media, MediaPosition(Media,#MEDIA_TIME_MSECS)-fps)
                    EndIf
                  OldPos = MediaPosition(Media,#MEDIA_TIME_MSECS)
                  Next
                  Play = 0
                  SetGadgetAttribute(5,#PB_Button_Image,ImageID(4)) 
                  EndIf
           
           Case 5    ;Play\Pause 
                If Run = 1
                PutRate(Media,GetGadgetState(13)/10)
                Play ! 1
                If Play = 1
                  SetGadgetAttribute(5,#PB_Button_Image,ImageID(3))
                  PlayMedia(Media)
                Else
                  SetGadgetAttribute(5,#PB_Button_Image,ImageID(4))
                  PauseMedia(Media)
                EndIf
                EndIf
            
           
           Case 7    ;Nframe
             If Run =1
                PauseMedia(Media)
                For i = 1 To GetGadgetState(6)
                MediaSeek(Media, MediaPosition(Media,#MEDIA_TIME_MSECS)+fps)
                If MediaPosition(Media,#MEDIA_TIME_FRAMES) = OldPos
                  MediaSeek(Media, MediaPosition(Media,#MEDIA_TIME_MSECS)+fps)
                EndIf
                OldPos = MediaPosition(Media,#MEDIA_TIME_MSECS)
                Next
                Play = 0
                SetGadgetAttribute(5,#PB_Button_Image,ImageID(4)) 
                EndIf
               
           Case 8    ;Save As
                hBitmap = CreateImage(0,WindowWidth(1),WindowHeight(1))
                hdc = StartDrawing(ImageOutput(0))
                SelectObject_(hdc, hBitmap)
                BitBlt_(hdc, 0, 0, WindowWidth(1),WindowHeight(1), GetDC_(GetDesktopWindow_()), WindowX(1),WindowY(1), #SRCCOPY | #CAPTUREBLT)
                StopDrawing()
                DeleteDC_(hdc)                
                If Run = 1
                  If GetGadgetState(17) = 0
                     SaveImage(0, GetHomeDirectory()+Cap$+" "+Right(Str(im),2)+".bmp",#PB_ImagePlugin_BMP)
                  ElseIf GetGadgetState(17) = 1
                     SaveImage(0, GetHomeDirectory()+Cap$+" "+Right(Str(im),2)+".jpg",#PB_ImagePlugin_JPEG)
                  Else
                     SaveImage(0, GetHomeDirectory()+Cap$+" "+Right(Str(im),2)+".png",#PB_ImagePlugin_PNG)
                  EndIf
                  im+1
                EndIf
                
                
           Case 9
                If Run =1
                    MediaPutVolume(Media, GetGadgetState(9) - 25)
                EndIf
                
           Case 10   ;Sound \ Mute
                If Run = 1
                Mute ! 1 
                If Mute = 1
                    SetGadgetAttribute(10,#PB_Button_Image,ImageID(0))
                    MediaPutVolume(Media, MediaGetVolume(Media)-80)
                Else
                    SetGadgetAttribute(10,#PB_Button_Image,ImageID(7))
                    MediaPutVolume(Media, MediaGetVolume(Media)+80)               
                EndIf
                EndIf 
           
           Case 11   ;Max \ Restore
                If Run =1
                Max ! 1 
                  If Max = 1
                      SetGadgetAttribute(11,#PB_Button_Image,ImageID(10))
                      ShowWindow_(WindowID(0),#SW_MAXIMIZE)
                  Else
                      SetGadgetAttribute(11,#PB_Button_Image,ImageID(9))
                      ShowWindow_(WindowID(0),#SW_RESTORE	)                  
                  EndIf
                EndIf
           
           Case 12    ;Quit
                If IsLibrary(0) 
                    CloseLibrary(0)
                EndIf
                If Run = 1
                    CloseMedia(Media)
                    FreeMedia(Media)
                EndIf
                Quit = 1
                
                
           Case 13
                If Run = 1
                   PutRate(Media,GetGadgetState(13)/10)
                EndIf
                
           Case 16
                  ResizeGadget(0,5, WindowHeight(0)-73, WindowWidth(0)-10,68)
                  ResizeGadget(1,0, 0, WindowWidth(0)-10,22)
                  ResizeWindow(1, 5, 5,WindowWidth(0)-10,WindowHeight(0)- 84)
                  ResizeMedia(Media, 0, 0, WindowWidth(1), WindowHeight(1),GetGadgetState(16))           
           
        EndSelect
          
                
          Case  #PB_Event_MoveWindow
                UpdateWindow_(WindowID(0))

              
          Case #PB_Event_Timer
                If Run = 1 And MediaState(Media) = #State_Running
                    Npos.f = MediaPosition(Media,#MEDIA_TIME_MSECS)
                    SetGadgetState(1, Int(Npos.f * 10000 / TTime ) )
                EndIf
         
;     
          Case #WM_LBUTTONDOWN
                GetCursorPos_ (@p.POINT) 
                ScreenToClient_ (WindowID(0), @p)     
                If ChildWindowFromPoint_ (WindowID(0), p\y<< 32+p\x) = GadgetID(0)
                   SetCursor_(LoadCursor_(0, #IDC_ARROW))
                Else
                    SetCursor_(LoadCursor_(0, #IDC_SIZEALL))
                    SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
                EndIf
    
;     
          Case #WM_RBUTTONDOWN
                Menu ! 1
                If Menu = 1
                    SetWindowColor(0,#Black)
                    HideGadget(0,1)
                Else
                    SetWindowColor(0,$45D1FE)
                    HideGadget(0,0)
                EndIf;     

EndSelect
;         
      
Until Quit = 1

If IsLibrary(0) 
    CloseLibrary(0)
EndIf

Last edited by RASHAD on Sat Mar 23, 2013 2:18 am, edited 1 time in total.
Egypt my love
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4637
Joined: Sun Apr 12, 2009 6:27 am

Re: Media PLayer [Windows]

Post by RASHAD »

Part #2

Code: Select all

DataSection
Mute3:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$B9E8C6E1F5FFFFFF
   Data.q $D82188D73E98DD7B,$2188D71F8AD81F8A,$E1F57BB9E83E98DD,$FFFFFFFFFFFFFFC6,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$D4E8F8FFFFFFFFFF,$8EDE1B8ADA288BD9,$E30F91E31291E116
   Data.q $0F92E30F91E30F91,$8CDB168FDF1293E1,$FFD4E8F8288BD91B,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$1F85D77DB8E7FFFF,$96E31597E41794E2,$E31696E31696E315,$1695E41698E41696
   Data.q $89DD1484DA1483D9,$E71F85D71795E313,$FFFFFFFFFFFF7DB8,$FFFFFFFFFFFFFFFF,$E3FFFFFFFFFFFFFF
   Data.q $1A9DE51F89DA6CAC,$9DE51B9DE51A9EE5,$E61B9DE51B9DE51B,$0446AF1898E41B9F,$54B6014FB6004EB6
   Data.q $DA1A9DE51CA2E90E,$FFFFFF6CACE31F89,$FFFFFFFFFFFFFFFF,$D97DB5E7FFFFFFFF,$21A4E720A6E91E89
   Data.q $A3E721A3E721A3E7,$A822A6E821A3E721,$E78F93662364576F,$50B7FFFFFFFFDCDC,$E921A4E722A8EB02
   Data.q $998DB41E89D920A6,$FFFFFF9999FF9999,$EA1E7ED3D4E6F6FF,$28A8E928A8E929A8,$A8E928A8E928A8E9
   Data.q $99239FE729AAEA28,$FF0000FA18181E3A,$53BAFFE6E6FF1D1D,$E928A8E929ADEC02,$F505095188BD28A8
   Data.q $FFFFFF4949FF0000,$EB2DA5E72578CFFF,$30ADEA30ADEA31AE,$B1EC30ADEA30ADEA,$F5004AB52BA3E831
   Data.q $F80709FFCACAD9F0,$53B2FF2E2EFF0000,$D330ADEA32B2ED14,$FF0000E7131A449C,$DCF2FFF3F3D51727
   Data.q $ED3BB7EE2384D6C5,$3CB9EF3BB8EE3AB5,$97E23DBBF03CB9EF,$FFDCF0F7024DB72A,$4F2E7A79B9E3FFFF
   Data.q $1933FF0000FF0202,$343EAEE540B2E8BE,$E8141BFF0000D228,$AADFC5DCF23877C1,$E842BDEF2FA1E677
   Data.q $0D61C41B68C638A9,$67C6095BC00B5EC3,$E4FFFFFFEEF8FA0E,$0E68C71268C97BBB,$0000FF0000FE9393
   Data.q $00B74458BC4354FF,$629AC4F30B0EFF00,$7ECD77AADF2FA1E6,$EC45BEF055C6F035,$FFFFFF0E63C53DB2
   Data.q $FFFFFFFFFFFFFFFF,$CA80C0E6FFFFFFFF,$1270CF49C5F2126B,$0000FF6E6EFFFFFF,$02FF0000FF0000FF
   Data.q $45BCEF788AAFFC02,$64C3357ECD55C6F0,$ED63CDF39EE6FA11,$FFFFFF1D6ABE41B5,$FFFFFFFFFFFFFFFF
   Data.q $F21774D14EA6E0FF,$1475D252C9F24FC3,$111FFFFDFDFFFFFF,$6CFF0000FF0000DA,$62CBF24AC1F0AE57
   Data.q $73CC1164C39EE6FA,$F19AE1F79DE7FA1A,$FFFFFF1764BB5CC5,$FFFFFFFFFFFFFFFF,$F355CBF40C69CAFF
   Data.q $167ED55ACCF457C9,$0000FF8D8DFFFFFF,$07FF0000FF0000FF,$98E0F787A3C0F906,$6BC4166DC89DE7FA
   Data.q $F59DE1F6A6EAFA17,$FFFFFF50C1F094DC,$FFFFFFFFFFFFFFFF,$F367D3F71074D1FF,$1A85D863D0F560CC
   Data.q $0000FF0202FFB0B0,$00E61E25BB5767FF,$A7C5D9F51719FF00,$59BB176BC4A6EAFA,$F4A1E3F8A9E9FA0D
   Data.q $FFFFFF4CBCED97DC,$FFFFFFFFFFFFFFFF,$F6339EE41986D9FF,$4471B56AD4F66AD4,$1E32FF0000FF0D0D
   Data.q $0FAEC1D388D9F2C9,$EE262AFF0000F90E,$6FC40D59BBAEDBEB,$F6A6E5F8ABE6F62D,$FFFFFF4CBCED9BDF
   Data.q $FFFFFFFFFFFFFFFF,$E850B0E5FFFFFFFF,$E712198DC9DE44AE,$B0D7FF2424FF0000,$BBA6E4F7ACE8F876
   Data.q $FF0000FC0707BAAD,$9DD82E6EC2E83E42,$F6C7F0FB72C0E972,$64C0EB6DC2EC9CE1,$C2EB5FBCEB62BEEB
   Data.q $E6FFFFFFFFFFFE6C,$FF0000E32E3594CB,$C0EBFFD9D9FF1010,$F8AAE6F8AEE8F96B,$FE0202C499A6AAE6
   Data.q $D5EEC63E56FF0000,$FBDDF7FD1F77CCC3,$B2EAFAB0EAFABEEC,$DFF5B4EBFAB3EAFA,$E1FFFEFE6DC3EC99
   Data.q $8C81A4B193A7FFE1,$C4EDFFFFFFFFD9D9,$F9ADE8F9B2EAFA6E,$E4C0C5BDECFAACE7,$FFFFD495A761538F
   Data.q $FD92D6F11458B7FF,$B0E9F9C7EFFADBF5,$EBF9B2EAF9B1EAF9,$FD6EC7ED9AE1F6B5,$88D1F0FFFFFFFFFF
   Data.q $C8EEFFFFFFFFFFFF,$FAB0E9F9B5ECFA71,$92D6F1DBF5FDC7EF,$FFFFFFFFFF1458B7,$FA0E5EBDD2E0F2FF
   Data.q $D4F1FBDBF5FCC9F1,$EBFAB3EAFAC1EDFA,$EF9FE3F7B8ECFBB5,$FFFFFFFFFFFF72C9,$CCEFFFFFFFFFFFFF
   Data.q $FCD4F1FBC6EFFB75,$0E5EBDC9F1FADBF5,$FFFFFFFFFFD2E0F2,$CE759CD5FFFFFFFF,$DBF5FCD5F7FC2781
   Data.q $F0FBD6F3FBD8F3FB,$F7BDEEFAC1EEFACC,$FFFEFE72CDF09FE3,$CFF0FFFFFFFFFFFF,$FCDBF5FCDEF5FC75
   Data.q $759CD52781CED5F7,$FFFFFFFFFFFFFFFF,$CCFFFFFFFFFFFFFF,$C8F0F9267FCD5F8A,$F4FCDAF4FDDDF7FD
   Data.q $FDDAF4FCDAF4FCD9,$71CEF0D2F0FBDDF5,$E2F5ABE0F5ABE1F5,$CDC8F0F9E0F8FEB0,$FFFFFF5F8ACC267F
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$0C59B87498D0FFFF,$F8FFD9F7FC92D4F0,$FCDBF4FDDEF5FDDF
   Data.q $D8F3FCDDF4FDDAF4,$F5FBD7F4FCD7F3FC,$D00C59B892D5F0D5,$FFFFFFFFFFFF7498,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$D2DDF1FFFFFFFFFF,$BBE71D71C6104BAD,$FED2F6FDB2E6F66B,$D3F6FDDAF9FEDAF9
   Data.q $71C66CBCE7B3E6F6,$FFD2DDF1104BAD1D,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$91CDC2D1EBFFFFFF,$B70140A7255CB56D,$0140A70D57B70D57,$D1EB6D91CD255CB5
   Data.q $FFFFFFFFFFFFFFC2,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF
Mute3end:

New2:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFBBCDE9FFFFFF
   Data.q $FF0745ABFFFFFFFF,$0745ABFFFFFFFFFF,$CDE9FFFFFFFFFFFF,$FFFFFFFFFFFFFFBB,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$40A76A8FCDFFFFFF,$A90659C292ABD907
   Data.q $0659C20742A90742,$8FCD0740A792ABD9,$FFFFFFFFFFFFFF6A,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$0847AEFFFFFFFFFF,$8CE9335EB47091CE,$D70395ED0737A504,$0298ED0370D70670
   Data.q $5EB6038BE80939A3,$FF0847AE7092CE34,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $0A46ABFFFFFFFFFF,$A1F10A52BB0A8BE6,$EA0997EA099DEF09,$0792E90898E90896,$50BB049EF10699EE
   Data.q $FF0A46AB0581E40B,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$B6FFFFFFFFFFFFFF,$0A3AA70A48B00C52
   Data.q $9BED0F9DF00FADF7,$EA0D98EA0E97EA0E,$0B96E90C98E90C98,$9BEC0B98EA0B96E9,$B10D3CA707A4F309
   Data.q $FFFFFF0C51B60C4A,$FFFFFFFFFFFFFFFF,$C7FFFFFFFFFFFFFF,$19ADF517A8F64779,$9EEA179FEC16A0EE
   Data.q $EB129AEB139EEB11,$119BEB129CEB129C,$97EB0F9BEB109BEB,$F10EA4F30F9AED0F,$FFFFFF487AC70B9C
   Data.q $FFFFFFFFFFFFFFFF,$B70D57BC6393D4FF,$20AAF0178DE10D4B,$A4EE1CA4EE1DA5EE,$ED1AA6ED1BA3ED1C
   Data.q $17A1EC18A1EC19A2,$9FEC169EEC179EEC,$E312A2ED159EEA16,$0D58BD0E4DB61285,$FFFFFFFFFF6393D4
   Data.q $FF1265C8E9F0FAFF,$27ADF029B0F22EC5,$ABF025ACEF26ABEF,$F123A9F123AAF123,$20AAF123A9F123AB
   Data.q $A7F020A9F021A9F0,$F11EA8EF1FA9F01D,$1361C71BBAFD1CAB,$FFFFFFFFFFE9F0FA,$EA0B4DB9AECAEDFF
   Data.q $1599EA1599EA1599,$99EA1599EA1599EA,$EA1599EA1599EA15,$1599EA1599EA1599,$99EA1599EA1599EA
   Data.q $EA1599EA1599EA15,$1052BB1D92E41599,$9ADBFFFFFFAECAED,$FC2BC1FB1670CF61,$05A0EFFFFFFFE8F6
   Data.q $92E4FFFFFE79CEF1,$FDFFFFFADFF1F61D,$007DE1F6F9F6FFFF,$58C7FFFFFE9DC5E4,$D1FFFFFA9DC5E400
   Data.q $29BAF81D92E40064,$FFFF639ADB176DCF,$FC0378DA699CDEFF,$008EE9FFFFFFE8F6,$92E4FFFFFFD2E4EF
   Data.q $DADFF1F6FFF9FB1D,$006FDA006EDA006E,$6ACCFFFFFFFFFFFF,$D6FFFFFFFFFFFF00,$167AD81D92E41781
   Data.q $DAF4FFFFFF6499DC,$FC1EABF10E70D5AF,$D2E4EFFFFFFFE8F6,$92E4FFFFFFFFFFFF,$E7DFF1F6FFF9FB1D
   Data.q $006FDA34A8E734A8,$E4EFFFFFFFFFFFFF,$E4FFFFFCFFFFFFD2,$33B2F01D92E49DC5,$D6F3B2DCF55AB1E7
   Data.q $FC4EC5F565B7EAAE,$FFFFFFFFFFFFE8F6,$A6E8FFFFFFB4D1EA,$FBDFF1F6FFF9FB32,$2CA4E6B4D1EAFEFB
   Data.q $FFFF99CBE9FFFFFF,$F9CADFEEFFFFFFFF,$6FC3EF45AAE6FFFD,$FFFFACD5F35EB1E8,$FC5DBAEC94CBEFFF
   Data.q $B4D1EAFFFFFFE8F6,$A4E8FFFFFF0094E9,$E4DFF1F6FFF9FB2D,$EEEFF45AB2E64DAC,$FFFF1A84D5FFFFFF
   Data.q $FF1984D5F5F7F9FF,$6BC1EF9DC5E4FFFF,$CEF1FFFFFF94CBEF,$FC96E5FC63B9EA94,$5BC4F1FFFFFDE8F6
   Data.q $BBECFFFFFD66C8F2,$FCFFF9FBDFF1F663,$EEEFF4B4D1EAFFFF,$FFFA5FB4E6B4D1EA,$F96AB8E6B4D1EAFF
   Data.q $6BC1EFCADFEEFFFF,$FFFF94CFF163B8EC,$F451ACE6C8E6F8FF,$83D6F77BD4F673D0,$D5F87CD4F783D6F7
   Data.q $F374CFF379D2F685,$75CDF372CDF56FCB,$C6F16DC6EF71CCF4,$EF6DC6EF70CAF06B,$5AB0E869C2ED68C4
   Data.q $FFFFFFFFFFC8E6F8,$FE67C0EEF1F9FEFF,$9FE3FAA2E4FCB2EE,$E3F99DE3F99DE0FA,$FA9BE1FA9DE3F99C
   Data.q $9AE0FB9BE1F99BE1,$E1FC9BE1FA9AE0FB,$FC9AE1FC98E1FC98,$65BEECA9EBFE9EE3,$FFFFFFFFFFF1F9FE
   Data.q $ED66BEEE9BD8F4FF,$A2E3FA8DDAF85DBA,$E3FA9FE3FA9FE3FA,$FA9DE2FA9FE3FA9F,$9CE1FA9DE1FA9DE2
   Data.q $E1F99AE2FA9CE1FA,$F79CE3F89AE1F99A,$66BEEE5FB9EE88D7,$FFFFFFFFFF9BD8F4,$F3FFFFFFFFFFFFFF
   Data.q $B4ECFDABE8FB87CE,$E5FBA4E5FBA6E7FB,$FBA3E4FBA3E4FBA3,$A0E2FBA0E4FBA0E4,$E3FA9FE3FAA0E2FA
   Data.q $FCABEAFCA1E5FA9F,$FFFFFF87CFF3A2E7,$FFFFFFFFFFFFFFFF,$F2FFFFFFFFFFFFFF,$58BBEF65C3F06CC7
   Data.q $E6FBACEAFBB5EEFD,$FBA6E6FBA5E6FBA9,$A2E5FBA6E5FBA6E6,$E8FDA6E5FBA8E5FB,$F05ABBEFB2ECFDA9
   Data.q $FFFFFF6DC7F266C3,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$6ACAF2FFFFFFFFFF,$EBFE76CEF5A1E6FD
   Data.q $FEACE9FCB2EAFEB3,$ABE9FCADE9FEADE9,$CEF4B0EBFDAEEAFD,$FF6CCAF49EE5FB73,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$75CEF5FFFFFFFFFF,$EBFC85D3F6A9E2F9,$F9B7EEFD67CAF3AE
   Data.q $B6EDFD97E0F997E0,$D3F6AAEAFC68CAF3,$FF75CEF5AAE2FA85,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$D0F4ADE6FAFFFFFF,$F784DBF8C1EBFC71,$85DBF874D0F774D0
   Data.q $E5FA76D1F7C1EBFC,$FFFFFFFFFFFFFFAC,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFDAF4FEFFFFFF,$FF75D3F8FFFFFFFF,$75D3F8FFFFFFFFFF,$F4FEFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFDB,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF
New2end:

Nframe:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$C5EDCFE8F8FFFFFF
   Data.q $E2349BDF51A9E48A,$349BDF3CA3E23CA3,$E8F88AC5ED51A9E4,$FFFFFFFFFFFFFFCF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$DAECF9FFFFFFFFFF,$C0EC43A5E2379ADD,$F682D4F677CDF263
   Data.q $82D4F681D3F681D3,$A5E263C0EC77CDF2,$FFDAECF9379ADD43,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$379ADB88C0EAFFFF,$D0F57FD2F76BC5EF,$F479CEF47ACFF57C,$79CEF479CEF479CE
   Data.q $D2F77CD0F57ACFF5,$EA379ADB6BC5EF7F,$FFFFFFFFFFFF88C0,$FFFFFFFFFFFFFFFF,$E4FFFFFFFFFFFFFF
   Data.q $79CEF442A1DF77B4,$CCF277CDF279CDF3,$F276CCF276CCF276,$76CCF276CCF276CC,$CDF276CCF276CCF2
   Data.q $DF79CEF479CDF377,$FFFFFF77B4E442A1,$FFFFFFFFFFFFFFFF,$DC87BBE5FFFFFFFF,$7BD3F97DD3F7409E
   Data.q $CAF47AD1F97BD4F9,$F478CFF774CAF275,$72C7F173C8F277CD,$C7F172C7F172C7F1,$F473C9F172C7F172
   Data.q $87BBE5409DDC79CE,$FFFFFFFFFFFFFFFF,$F5308BD1D9E9F6FF,$002E834096D373CB,$ADE1003083003186
   Data.q $C60B499D6FC8F354,$72CAF46FC8F32C7E,$C5F16EC5F16FC6F2,$F26EC5F16EC5F16E,$308BD16FC7F26FC6
   Data.q $FFFFFFFFFFD9E9F6,$F35DB8E82F80CBFF,$E1E9F1277CC370C8,$80C78DB4D4FFFFFF,$C62C67AA50ABE22E
   Data.q $3D95D400388C6097,$C1EF6BC4F171CBF5,$EF69C1EF69C1EF69,$5DB8E86BC3F069C1,$DFF2FFFFFF2F80CB
   Data.q $F06AC4F0348CD0CB,$D3DEEB267CC468C4,$83C888AFD2FFFFFF,$FF3875B54FA9E22E,$2F6FB2EBF3F7FFFF
   Data.q $C5F14CA7E00F5BAC,$ED64BEED65BFEE6A,$6AC4F064BFED64BE,$AEDDCBDFF2348CD0,$EE61BBEC48A5DF80
   Data.q $D4E0EC277DC662BD,$83C98AB3D5FFFFFF,$FF3B77B94AA6E02E,$FFFFFFFFFFFFFFFF,$72BC1358A8B3CBE3
   Data.q $EC62BDEE57B5E921,$61BBEC5FB9EB60BA,$82C880AEDD48A5DF,$EC57B2E965BAE93F,$D5E1ED277EC85DB7
   Data.q $84CB8BB5D7FFFFFF,$FF3F7FBE48A2DF2E,$FFFFFFFFFFFFFFFF,$B6D9FFFFFFFFFFFF,$EF2D83CC0F58AA8B
   Data.q $59B2E95CB6EA60BC,$6BBC3F82C865BAE9,$E962B8E992D1F31C,$D7E2EE267FCA53B1,$85CC8FB8DAFFFFFF
   Data.q $FF4285C145A1DF2D,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$B0669DCEFCFCFDFF,$65BCEB3A99D70B5A
   Data.q $70BE1C6BBC92D2F3,$EA83C6ED86CCF124,$D7E4EF2180CB5EB5,$87CD93BDDEFFFFFF,$FF468DC9409EDD2C
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$F4FFFFFFFFFFFFFF,$66AADB4F92C9E2ED,$69B5226DB988CEF2
   Data.q $EA77C0E980C9EE20,$D8E5F1479BD67EC5,$89CF94BFE0FFFFFF,$FF4C92CD3D9CDD2B,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$F2FFFFFFFFFFFFFF,$66ACDD69A9D6D6E4,$58AB2069B681CBEF,$E972BDE879C2EA15
   Data.q $E5ECF55CA9DD73BE,$86D095C1E1FFFFFF,$FF4D98D03599DC27,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $D77DB7DCF4F6FAFF,$73BFE96BB7E4529F,$70B71558AB79C2EA,$E76CB9E777BAE136,$E5ECF658A9DD6EBA
   Data.q $A6DCBAD8EBFFFFFF,$FF60A7DA4BA6DF52,$FFFFFFFFFFFFFFFF,$C9E6FFFFFFFFFFFF,$E764B0E04F9FD79E
   Data.q $6CB9E76EBAE76EBB,$9DCD3670B777BAE1,$E587C9EB4F94CB77,$E5EEF658A9DE64B7,$ACE0B9D8ECFFFFFF
   Data.q $FF8BC0E564B4E55D,$FFFFFFFFFFFFFFFF,$ACDF5EA9DCB9D9ED,$E468B8E568B7E55D,$87C9EB64B6E367B7
   Data.q $D6EA779DCD4F94CB,$E792CBEB2164AEC7,$E7EFF752AADF6FBA,$ADE1BCDBEFFFFFFF,$FF8EC5E85DB1E259
   Data.q $6EB6E3E1ECF6FFFF,$B5E55EB3E35CACE0,$E35FB3E460B4E460,$92CBEB6FBAE65DB2,$FFFFC7D6EA2164AE
   Data.q $EC559BD11A53A4FF,$EFF4FA6CB9E390CE,$AEE2C5DFF1FFFFFF,$ED81C4EB59B2E25A,$59B1E15DB1E596CD
   Data.q $B0E259B0E258B0E2,$E656AFE158AFE259,$559BD190CEEC75BF,$FFFFFFFFFF1A53A4,$DE1452A2D5E0EFFF
   Data.q $60B3E77AC2EA70B4,$ADE066B6E75EB1E6,$E264B8E750ADDF51,$4EADE04CABDF57B2,$A9DF4CABDF4EACE0
   Data.q $EB7EC2E75FB4E34A,$1452A26EB4DE86CA,$FFFFFFFFFFD5E0EF,$AC7698C8FFFFFFFF,$80C6E971B8E11F62
   Data.q $B7E273C0E57DC2E7,$DD45A8DD52ADDF64,$46A9DD43A6DD42A5,$C0E665B8E252ADDF,$E17FC5E97EC2E775
   Data.q $7698C81F62AC71B7,$FFFFFFFFFFFFFFFF,$BDFFFFFFFFFFFFFF,$61ABD91E61AB6286,$C1E674C1E675C2E5
   Data.q $E676C1E675C1E674,$76C1E676C3E676C3,$C1E674C1E675C1E6,$AB61ABD975C2E574,$FFFFFF6286BD1E61
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$11499A7495C3FFFF,$BFE467B5DF4691CA,$E46FBFE471BFE56F
   Data.q $6FBFE46FBEE46FBE,$B5DF6FBFE471BFE5,$C311499A4691CA67,$FFFFFFFFFFFF7495,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$D3DEECFFFFFFFFFF,$7EBE1756A40F4494,$E162B0DB51A1D335,$62B0DB6AB7E16AB7
   Data.q $56A4357EBE51A1D3,$FFD3DEEC0F449417,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$90C0C4D2E5FFFFFF,$98083D8F2A589F70,$083D8F0F49980F49,$D2E57090C02A589F
   Data.q $FFFFFFFFFFFFFFC4,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF
Nframeend:

Pause2:
   Data.q $000000000B164D42,$0028000000360000,$0018000000260000,$0000001800010000,$1E7800000AE00000
   Data.q $000000001E780000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$B0EB82C9F1CAE8F9,$E932ADE929A3E747,$47B0EB29A3E732AD
   Data.q $FFFFCAE8F982C9F1,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $EDFAFFFFFFFFFFFF,$F139B0E930A2E6D7,$87E1F87ADBF660CD,$E1F886E0F886E0F8,$E960CDF17ADBF687
   Data.q $D7EDFA30A2E639B0,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$EFFFFFFFFFFFFFFF
   Data.q $69D4F32CA1E583C4,$DCF87FDDF883DFF9,$F77CDBF77CDBF77D,$7DDCF87CDBF77CDB,$D4F383DFF97FDDF8
   Data.q $FF83C4EF2CA1E569,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$DCF738ACE770B8EA
   Data.q $F77EDFF77EDDF77C,$7ADBF67DDEF77EDF,$DBF679DAF579DAF5,$F77EDFF77DDEF77A,$7CDCF77EDDF77EDF
   Data.q $FFFF70B8EA38ACE7,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$F734A7E580BDEBFF,$4CB8E87BDDF87CDD
   Data.q $84D42085D52084D5,$F777D9F758C5EE1F,$1F84D458C5EE77D9,$B8E82084D52085D5,$E57CDDF77BDDF84C
   Data.q $FFFFFF80BDEB34A7,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$238FDCD5E9F8FFFF,$B2E872D5F56FD6F5,$DB8EBCDE0443A248
   Data.q $001F8C8FBFDF85B6,$1F8C76DDFA76DDFA,$DE85B6DB8FBFDF00,$48B2E80443A28EBC,$8FDC6FD6F572D5F5
   Data.q $FFFFFFFFD5E9F823,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$85D7FFFFFFFFFFFF,$F46AD1F457C4EE26,$2A73C044B2E86BD1,$FFFFFFFFFFFFFFFF
   Data.q $FA70DAFA002B97FF,$FFFFFF002B9770DA,$73C0FFFFFFFFFFFF,$F46BD1F444B2E82A,$2685D757C4EE6AD1
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF
   Data.q $F4FFFFFFFFFFFFFF,$66D1F32891DBC5DE,$AFE763CDF261CBF1,$FFFFFFFF2D77C342,$00319FFFFFFFFFFF
   Data.q $319F68D6F768D6F7,$FFFFFFFFFFFFFF00,$42AFE72D77C3FFFF,$D1F361CBF163CDF2,$FFC5DEF42891DB66
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $B0E777AEE2FFFFFF,$F15AC6F05CC8F13F,$337DC83FADE55CC8,$FFFFFFFFFFFFFFFF,$F561D0F50038A4FF
   Data.q $FFFFFF0038A461D0,$7DC8FFFFFFFFFFFF,$F05CC8F13FADE533,$3FB0E75CC8F15AC6,$FFFFFFFFFF77AEE2
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$D0FFFFFFFFFFFFFF
   Data.q $53BFEF62C6EE3580,$A8E557C2F055C0EF,$FFFFFFFF3886CC3C,$0040ABFFFFFFFFFF,$40AB5BC9F45BC9F4
   Data.q $FFFFFFFFFFFFFF00,$3BA8E53683CAFFFF,$BFEF55C0EF57C2F0,$FF3580D062C6EE53,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$E0F60E69C6FFFFFF
   Data.q $EE4AB9ED5FC5EF97,$3484CD38A6E44EBC,$FFFFFFFFFFFFFFFF,$F152C3F1004BB1FF,$FFFFFF004BB152C3
   Data.q $77C5FFFFFFFFFFFF,$ED4FBDEE329EE02A,$97E0F65FC5EF4AB9,$FFFFFFFFFF0E69C6,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$C9FFFFFFFFFFFFFF,$86D3F28AD9F4176E
   Data.q $A4E441B7ED56C0EE,$FFFFFFFF3A8BCF32,$0055BBFFFFFFFFFF,$55BB49BFF049BFF0,$FFFFFFFFFFFFFF00
   Data.q $2C9ADF3483CBFFFF,$D3F256C0EE42B9ED,$FF156BC48AD9F586,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$D8F31364BFFFFFFF,$EF7FD1EF7CD0EF83
   Data.q $3B91D32DA1E26BCA,$FFFFFFFFFFFFFFFF,$EC42B8EC015BBFFF,$FFFFFF015CC141B8,$8ACFFFFFFFFFFFFF
   Data.q $EF6BCBEF2597DE36,$83D8F37CD0EF7FD1,$FFFFFFFFFF1365C0,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$B4FFFFFFFFFFFFFF,$74CBEF7AD1F00850,$C2EB77CDF075CBEF
   Data.q $FFFFFFFF65AFDF68,$025FC4FFFFFFFFFF,$67C937B1EA32ABE8,$FFFFFFFFFFFFFF05,$5DB9E85DA9DBFFFF
   Data.q $CBEF75CBEF78CDF0,$FF0850B47AD1F074,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$C8EA2A68BEFFFFFF,$ED6BC7ED6AC7EE76,$88C6E965C0EB6DC8
   Data.q $FFFFFFFFFFFFFFFF,$E937ACE7147BD0FF,$FFFFFF1882D33CB2,$BFE5FFFFFFFFFFFF,$ED6DC8EE5BB8E77E
   Data.q $76C8EA6AC7EE6BC7,$FFFFFFFFFF2A68BE,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000
   Data.q $FFFFFFFFFFFFFFFF,$D2FFFFFFFFFFFFFF,$8DD6F2449BD76F98,$BFEA64C5EC60C3EC,$FFFFFFFF8BCAE85E
   Data.q $4DA9E2FFFFFFFFFF,$B0E469C8ED63C4EB,$FFFFFFFFFFFFFF53,$57BAE78ACAE8FFFF,$D6F260C3EC65C5ED
   Data.q $FF6F98D2449BD78D,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$5FB7C1D2EBFFFFFF,$EB70C8ED99DBF211,$8DCEED59BDE959BE,$FFFFFFFFFFFFFFFF
   Data.q $EC58BDEB4CADE3FF,$FFFFFF54B3E65DC1,$CDECFFFFFFFFFFFF,$ED59BFEB54B9E78E,$115FB799DBF270C8
   Data.q $FFFFFFFFFFC1D2EB,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$4EA3DC104CADFFFF,$BBE976CDED96DDF2,$FFFFFFFF94D3EF51,$54B5E7FFFFFFFFFF
   Data.q $BBE952BBE94EB7E8,$FFFFFFFFFFFFFF5C,$4BB7E894D2EFFFFF,$A3DC96DDF277CDED,$FFFFFFFF104CAD4E
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $DDEFFFFFFFFFFFFF,$F16AC2E80748A8D1,$7ECDEF7CCFEF8CD6,$EEF9D0EAF7D3EAF8,$E744B5E65FC0ECDA
   Data.q $D9EEF869C5EF46B7,$C9EED5ECF8D0EAF7,$E88DD6F178CDED79,$D1DDEF0748A86AC2,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $6F92CBFFFFFFFFFF,$D4EF70C5E9125AB5,$EB72CDED76CEEE81,$43B6E74CBCE963C5,$B6E738AEE539AEE5
   Data.q $ED63C5EB4CBCE943,$81D4EF76CFEE72CD,$92CB125AB570C5E9,$FFFFFFFFFFFFFF6F,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $B3597EC0FFFFFFFF,$76D0EC5BB6E41059,$D0EC76CFED76D0ED,$ED79D0ED78D0ED77,$77D0EC78D0ED79D0
   Data.q $D0EC76D0ED76CFED,$C01059B35BB6E476,$FFFFFFFFFFFF597E,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $3D9F6D8DC4FFFFFF,$EC65C1E83A96D502,$70CCEC72CDED6ECE,$CCEC6FCBEC6FCBEC,$E86ECEEC72CDED70
   Data.q $023D9F3A96D565C1,$FFFFFFFFFF6D8DC4,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $093A98CED9ECFFFF,$A9DD277EC9094CAA,$E967C4E95DBAE648,$48A9DD5DBAE667C4,$3A98094CAA277EC9
   Data.q $FFFFFFFFCED9EC09,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $C0BDCCE4FFFFFFFF,$002E91214CA16786,$2E91003C9D003C9D,$E46786C0214CA100,$FFFFFFFFFFFFBDCC
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$0000FFFFFFFF
Pause2end:

Play2:
   Data.q $000000000B164D42,$0028000000360000,$0018000000260000,$0000001800010000,$1E7800000AE00000
   Data.q $000000001E780000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$B2E88DCAEFD0EAF8,$E642ACE63AA4E355,$55B2E83AA4E342AC
   Data.q $FFFFD0EAF88DCAEF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $EEFAFFFFFFFFFFFF,$F049AEE63CA1E0DC,$8CDBF782D4F46CC8,$DBF78BDAF68BDAF6,$E66CC8F082D4F48C
   Data.q $DCEEFA3CA1E049AE,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$ECFFFFFFFFFFFFFF
   Data.q $75CEF33CA2DE8CC6,$D5F586D6F68AD8F7,$F583D4F583D4F584,$84D5F583D4F583D4,$CEF38AD8F786D6F6
   Data.q $FF8CC6EC3CA2DE75,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$D5F649AAE37ABBE7
   Data.q $F581D3F583D3F584,$80D2F481D3F482D3,$D2F480D2F480D2F4,$F480D2F480D2F480,$84D5F683D3F581D2
   Data.q $FFFF7ABBE749AAE3,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$F645A8E089C0E8FF,$7DD0F47DD0F384D5
   Data.q $D8F965BEEA7ACFF3,$F37CCFF37ED1F484,$7CCFF37CCFF37CCF,$CFF37CCFF37CCFF3,$E084D5F67DD0F37C
   Data.q $FFFFFF89C0E845A8,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$3695D7DAEBF8FFFF,$CCF279CDF379CFF3,$9B1E6BB87FD3F678
   Data.q $6FCBF1186AB80845,$CCF279CDF37ED2F5,$F278CCF278CCF278,$78CCF278CCF278CC,$95D779CFF379CDF3
   Data.q $FFFFFFFFDAEBF836,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$8AD1FFFFFFFFFFFF,$F174CCF265C0EC33,$79D2F672CAF172CA,$BBDADFEBF01362B6
   Data.q $F3348CCF00449E93,$73CBF175CEF473CC,$CAF172CAF172CAF1,$F272CAF172CAF172,$338AD165C0EC74CC
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF
   Data.q $F4FFFFFFFFFFFFFF,$73CBF33A96D7CCE2,$C6F06DC6F06DC6F0,$F21566B673CEF56D,$FFFFFEFFFFFFDFE7
   Data.q $A0DC0650AA4E8CC5,$F06FC9F174CEF644,$6DC6F06DC6F06DC6,$CBF36DC6F06DC6F0,$FFCCE2F43A96D773
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $AEE382B4E1FFFFFF,$EE68C2EE6AC4EF51,$6EC9F268C2EE68C2,$FFFFDFE7F11869BC,$F3FFFFFFFFFFFFFF
   Data.q $1869BA2872BBE3ED,$C3EF6EC8F253AFE3,$EE68C2EE68C2EE69,$51AEE36AC4EF68C2,$FFFFFFFFFF82B4E1
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$CEFFFFFFFFFFFFFF
   Data.q $60BBEC6FC3ED438A,$BDEC62BDEC62BDEC,$F2196DBE67C3EF62,$FFFFFFFFFFFFDFE8,$FFFFFFFFFFFFFFFF
   Data.q $C90C5AAFC4D9EBFF,$65BFEE62BFED277E,$BBEC62BDEC63BCEC,$FF438ACE6FC3ED60,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$D8F61F74C3FFFFFF
   Data.q $EA58B8EA6BC1EC9C,$60C0ED5CBAEA5CBA,$FFFFE0EBF31C74C1,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $5AB488B9DBFFFFFF,$EA61C0EE3691D40A,$9CD8F66BC1EC5AB8,$FFFFFFFFFF1F74C3,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$C5FFFFFFFFFFFFFF,$8ECDF091D4F32878
   Data.q $B5E951B3E963BDEB,$F41D78C858BAEC54,$FFFFFFFFFFFFE1EC,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $569AD0FFFFFFFFFF,$CDF064BFEB1C6FC0,$FF2676C391D4F38E,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$D1F02372BDFFFFFF,$EA85CBEC82CAEC89
   Data.q $4EB3E74BAFE674C3,$FFFFE2EBF41E7DCB,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFDFFFFFFFFFFFF
   Data.q $ED4B98D370AEDCFF,$89D1F082CAEC85CA,$FFFFFFFFFF2372BD,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$B3FFFFFFFFFFFFFF,$7CC5EB83CBEE1960,$C6EB7EC6EB7CC5EB
   Data.q $F52082CF62BEEB7D,$FFFFFFFFFFFFE1ED,$FFFFFFFFFFFFFFFF,$E7FFFFFFFFFFFFFF,$6BB4E12D88CDA4CC
   Data.q $C5EB7DC6EC7CC7EC,$FF1960B383CBEE7C,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$C2E53875BEFFFFFF,$E977C2E976C2EA82,$7BC5EA78C2E977C2
   Data.q $FFFFE8F1F764B0DD,$FFFFFFFFFFFFFFFF,$DBEAF4FFFFFFFFFF,$C3EA66B1DF53A2D9,$E978C2E979C3EA77
   Data.q $82C2E576C2EA77C2,$FFFFFFFFFF3875BE,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000
   Data.q $FFFFFFFFFFFFFFFF,$D2FFFFFFFFFFFFFF,$91D1EE579ED379A2,$C0E870C0E86DC0E9,$F960B2E171C1E970
   Data.q $FFFFFFFFFFFFEAF3,$BFE5F0F5FAFFFFFF,$E96CBDE661B0E083,$70C0E871C1E871C2,$D1EE6DC0E970C0E8
   Data.q $FF79A2D2579ED391,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$6BB8C8D8ECFFFFFF,$E878C3E99ED4EF22,$68BCE868BBE866BB,$FFFFEDF4F962B4E4
   Data.q $E3AFD7EEFFFEFFFF,$69BDE967BAE560B1,$BDE869BDE86ABDE8,$E966BBE868BBE869,$226BB89ED4EF78C3
   Data.q $FFFFFFFFFFC8D8EC,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$5FA6D71B5AACFFFF,$B7E57EC7E99AD6F0,$FB64B8E75EB9E55F,$71BEE7CCE5F5F2F5
   Data.q $BAE65FBAE662B8E6,$E661BAE661BAE661,$5FB7E55FB9E661BA,$A6D79AD6F07EC7E9,$FFFFFFFF1B5AAC5F
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $E2F0FFFFFFFFFFFF,$EE78BDE31759AAD6,$67BCE688CBEA92D1,$BBE97DC6ED67BCEA,$E457B6E458B5E365
   Data.q $57B5E457B6E458B6,$BDE751B3E355B5E3,$E392D1EE88CBEA68,$D6E2F01759AA78BD,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $779CCDFFFFFFFFFF,$CEEB7AC2E52269B4,$E881C8E987CBEA89,$4CB2E157B5E373C2,$B2E14BAEE14BAEE1
   Data.q $EA6EC1E65AB6E34D,$89CEEB88CBEA7FC7,$9CCD2269B47AC2E5,$FFFFFFFFFFFFFF77,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $B4638AC3FFFFFFFF,$7FCAE96AB4DF2068,$C9EA7EC8EA7EC9EA,$EA81CAEA80C9EA7F,$7FC9EA80C9EA81CA
   Data.q $CAE97EC9EA7EC8EA,$C32068B46AB4DF7F,$FFFFFFFFFFFF638A,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $50A37698C7FFFFFF,$E871BEE44C9AD114,$79C5E87BC7E97AC8,$C5E879C5E879C5E8,$E47AC8E87BC7E979
   Data.q $1450A34C9AD171BE,$FFFFFFFFFF7698C7,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFF0000FFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $124A9DD4DFEEFFFF,$A9D93A88C6195DAC,$E674C2E66CB9E25A,$5AA9D96CB9E274C2,$4A9D195DAC3A88C6
   Data.q $FFFFFFFFD4DFEE12,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFF0000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $C4C5D3E7FFFFFFFF,$0A41972C5DA67192,$41971151A11151A1,$E77192C42C5DA60A,$FFFFFFFFFFFFC5D3
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$0000FFFFFFFF
Play2end:

Pframe:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$C3ECD0E7F7FFFFFF
   Data.q $E03899DD53A8E28B,$3899DD3FA1E03FA1,$E7F78BC3EC53A8E2,$FFFFFFFFFFFFFFD0,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$DBECF9FFFFFFFFFF,$BEEC47A4E03998DB,$F682D2F678CBF264
   Data.q $82D2F682D1F682D1,$A4E064BEEC78CBF2,$FFDBECF93998DB47,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$3B98D98AC0E9FFFF,$CEF57FD1F76BC3EF,$F479CCF47ACDF57C,$79CCF479CCF479CC
   Data.q $D1F77CCEF57ACDF5,$E93B98D96BC3EF7F,$FFFFFFFFFFFF8AC0,$FFFFFFFFFFFFFFFF,$E2FFFFFFFFFFFFFF
   Data.q $7ACCF446A1DE7AB4,$C9F278C9F27ACAF3,$F277C9F277C9F277,$77C9F277C9F277C9,$C9F277C9F277C9F2
   Data.q $DE7ACCF47ACAF378,$FFFFFF7AB4E246A1,$FFFFFFFFFFFFFFFF,$DA89BBE4FFFFFFFF,$74C7F27ACCF4439D
   Data.q $C6F173C6F173C6F1,$F273C6F173C6F173,$79CDF678CCF574C7,$D0F976CAF474C7F2,$F77CD0F97CD1F97B
   Data.q $89BBE4439EDB7DD0,$FFFFFFFFFFFFFFFF,$F1338BD0DAE9F6FF,$6EC2F06FC3F171C5,$C2F06EC2F06EC2F0
   Data.q $F372C8F46FC3F16E,$1456A32875BB6FC6,$32814C9FD978CDF8,$D900348500358400,$338BD075C8F44DA0
   Data.q $FFFFFFFFFFDAE9F6,$EF5DB4E83381CAFF,$6ABFEE6ABFEE6CC0,$C1F06BBEEE6ABFEE,$8B3A8CCA72C9F66D
   Data.q $2C66A878A4CB003A,$E8F02A7BC274CAF7,$C38BB2D2FFFFFFDD,$5DB4E871C5F32F7E,$E0F2FFFFFF3381CA
   Data.q $EC6AC2EF378CCFCC,$65BBEC65BBEC65BD,$A6DE6BC2F166BEED,$FE3271B1074A9E50,$3974B2FFFFFFFCFD
   Data.q $DDEB2A7DC36CC6F4,$C586ABD0FFFFFFCF,$6AC2EF69C1EF2F82,$B0DBCCE0F2378CCF,$EA62B8EB4BA3DE81
   Data.q $63BAED61B7EB60B6,$58A41F6BB85AB2E7,$FFFFFFFFD9E5EF15,$3C77B7FFFFFFFFFF,$DEEC2A7EC466C0F1
   Data.q $C789B1D3FFFFFFD1,$62B8EB63BAED3082,$84C781B0DB4BA3DE,$EA5AB0E866B6E843,$3184CA5BB2E95DB4
   Data.q $FFFF9EC0DC0E53A4,$FFFFFFFFFFFFFFFF,$417DBAFFFFFFFFFF,$DFED2A7EC65FB9EE,$C88AB2D5FFFFFFD2
   Data.q $59B0E85EB4EB3082,$6DB94384C766B6E8,$D466BAEA91D0F221,$659BCC0C54A93B91,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$4383BFFFFFFFFFFF,$E0EE2980C758B5ED,$C98CB4D8FFFFFFD4,$63B5E855B1E92F83
   Data.q $72BD216DB990CFF2,$CC60A2D587CAF128,$FFFFFFEFF6F86099,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $4989C4FFFFFFFFFF,$E3EF2881C951B0E9,$CA8FBADBFFFFFFD5,$82C2EC5FB3E92982,$6AB3266FB885C7F0
   Data.q $D463A6D881C9EE24,$FFFFFFEBF1F968A3,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$4D90CBFFFFFFFFFF
   Data.q $E5F12883CB4AAAE4,$D592BCDDFFFFFFD6,$79BEE87DC2E94F9C,$5BA9246AB480C6ED,$E375BFEA7AC0EA1A
   Data.q $7CB3DA519AD06CB5,$FFFFFFFFFFFDFFFF,$FFFFFFFFFFFFFFFF,$4E96CEFFFFFFFFFF,$E6F12580CB41A3E0
   Data.q $DDB5D0E9FFFFFFD6,$73BCE874BDE961A8,$72B51A5BA97AC0E9,$E76DB8E777B7DF39,$63AEDF70BAE86FB9
   Data.q $FFFFABCEE94F9AD4,$FFFFFFFFFFFFFFFF,$61A6D8FFFFFFFFFF,$EDF84FA0D851ABE3,$DCB4D3EAFFFFFFE5
   Data.q $6DB8E76FB9E75FAA,$9ECC3972B577B7DF,$E385C5EA5293C979,$69B6E568B5E465B5,$A6DA5FAADD68B6E5
   Data.q $FFFFFFFFC4DDF15E,$89BDE4FFFFFFFFFF,$ECF65CA8DC67B7E5,$DDB7D6EBFFFFFFE3,$85C5EA65B5E45EA9
   Data.q $D7EA799ECC5293C9,$E791C9EB2465ADC8,$60B0E25EAFE170B9,$AFE161B2E362B1E2,$F97CBAE45CA9DF5F
   Data.q $8DC3E8FFFFFFE6F2,$EFF757A9DD5CAFE1,$DEB8D8EFFFFFFFE4,$91C9EB70B9E757A9,$FFFFC8D7EA2465AD
   Data.q $ED589ACD1C56A2FF,$57ADDF75BDE68FCD,$AEE05AAEE059ADE0,$E35AADDF59AEE05A,$8DC6EBA0CFEE5DAE
   Data.q $F4FB58AADF56ACDF,$E4C1DCF0FFFFFFEE,$589ACD8FCDED6EB7,$FFFFFFFFFF1C56A2,$DC1854A1D5E1EEFF
   Data.q $7CC0E685C4EA6FB1,$A9DD4DA8DD61B2E0,$DD51A9DE51A9DE4F,$66B5E65BAFE14FA9,$B1E656ACDF4EA8DD
   Data.q $E963B1E65EAFE564,$1854A16FB2DC7CC1,$FFFFFFFFFFD5E1EE,$AA789AC7FFFFFFFF,$7DC2E873B6DE2364
   Data.q $B6E176BEE57CC0E6,$DC4AA8DC54AADD67,$48A7DC45A4DC46A4,$BDE466B6E054AADD,$DE7EC3E87CBFE674
   Data.q $789AC72364AA73B6,$FFFFFFFFFFFFFFFF,$BDFFFFFFFFFFFFFF,$63ABD82062AA6388,$BEE575C0E676C0E3
   Data.q $E576BFE576BFE575,$76BFE577C0E577C0,$C0E675BEE576BFE5,$AA63ABD876C0E375,$FFFFFF6388BD2062
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$134D997596C2FFFF,$BDE269B3DE498FC7,$E370BBE372BCE371
   Data.q $70BBE370BBE370BB,$B3DE71BDE272BCE3,$C2134D99498FC769,$FFFFFFFFFFFF7596,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$D4DEECFFFFFFFFFF,$7EBC1958A1114793,$E065AFDB549FCF38,$65AFDB6CB7E06CB7
   Data.q $58A1387EBC549FCF,$FFD4DEEC11479319,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$91BFC4D2E5FFFFFF,$9709408E2B5B9E70,$09408E114C97114C,$D2E57091BF2B5B9E
   Data.q $FFFFFFFFFFFFFFC4,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF
Pframeend:

Save:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$61AF000000000000,$AF1659AB1659AB1C,$2A6BB02D6EB21C61,$6BB02A6BB02A6BB0
   Data.q $B02A6BB02A6BB02A,$2A6BB02A6BB02A6B,$6BB02A6BB02A6BB0,$B22A6BB02A6BB02A,$185BAC1C61AF2D6E
   Data.q $61AF185BAC1559AB,$7F149AE56DC8EE1C,$DED9D6E4E0DC9584,$D9D6DED9D6DED9D6,$D6DED9D6DED9D6DE
   Data.q $DED9D6DED9D6DED9,$D9D6DED9D6DED9D6,$DCDED9D6DED9D6DE,$199DE695847FE4E0,$72BC185BAC229ADE
   Data.q $901699E379C9EC28,$D8DADBDCDDDE9D8F,$DEDFDCDEDEDBDCDE,$E1DEE0E0DDDFE0DD,$E0E2E2DFE1E2DFE0
   Data.q $E3E5E1E3E4E1E2E3,$E0DEE0E1E2E3E5E2,$1D9CE49D8F90DDDE,$76BD1C68B628A0E0,$951E9BE480CDEE2D
   Data.q $A6A4AFE3E5E4A194,$77878781918E899A,$6D6D677675717F7F,$564F5D5F5764665F,$3A4749424E4E4855
   Data.q $E95B555F39323C43,$259EE5A19495E8E9,$77BF206BBA31A2E2,$99259EE585CFEF30,$E6E8E7E4E6E5A599
   Data.q $E8E7E6E8E7E6E8E7,$E7E6E8E7E6E8E7E6,$E6E8E7E6E8E7E6E8,$E8E7E6E8E7E6E8E7,$E7E6E8E7E6E8E7E6
   Data.q $2BA1E7A59999E6E8,$7AC3226CBC38A7E4,$9F2BA3E68CD1F031,$DADADCE9EAECAA9D,$D7D8D7D6DAD7D8D9
   Data.q $D6D4D4D7D6D5D8D6,$D1D2D4D3D2D6D3D4,$D0D2D0D1D3D1D1D4,$EDD1D2D3CECDD0CF,$31A6E7AA9D9FEAEC
   Data.q $7FC52670BE3EABE5,$A432A7E790D3F135,$AAA8B2EEF0F0AFA2,$7585847F8F8B8797,$6C6B6474736F7D7D
   Data.q $544D5B5D5562635D,$3845473F4C4C4653,$F45D5662362F3941,$39AAE9AFA2A4F3F5,$83C72773C046AEE6
   Data.q $A838ABE994D3F035,$F0F1F0F0F1F0B4A7,$F8F6F5F7F5F3F5F4,$F9F8F9F8F7F9F7F6,$FAFDFBFAFBFAF8FB
   Data.q $FFFEFDFEFDFCFEFC,$F2F8F9F8FDFFFEFD,$3EAEEAB4A7A8F1F2,$85C92977C34BB3E8,$AC3EAEEB98D5F239
   Data.q $F7F7F8F5F5F6B8AA,$F7F8F7F7F8F7F7F8,$F8F7F7F8F7F7F8F7,$F7F7F8F7F7F8F7F7,$F7F8F7F7F8F7F7F8
   Data.q $F8F7F7F8F7F7F8F7,$43B1ECB8AAACF7F7,$89CB2C7BC650B6EA,$B244B2EC9DD7F339,$C2C0C7F8FAF9BDAF
   Data.q $9DA7A6A3AEABA9B3,$9694919B9B99A09F,$8581898B858F908B,$70787B7380807A84,$FD8E8B926D687076
   Data.q $49B5EDBDAFB2FCFE,$8DCD2E7DC856BAEB,$B649B5EEA0D8F43D,$F6F6F7F9F9FAC2B7,$FAFAF9F9FAF9F9F9
   Data.q $FCFBFBFCFBFBFBFA,$FCFDFDFCFCFCFBFB,$FEFEFDFDFEFDFDFE,$FAFBFBFBFDFEFEFD,$4FB7EEC2B7B6FAFA
   Data.q $90D03185CA5BBBED,$A650BAEEA5DAF340,$FFFFFEFFFFFFB5A6,$FFFEFFFFFEFFFFFE,$FEFFFFFEFFFFFEFF
   Data.q $FFFFFEFFFFFEFFFF,$FFFEFFFFFEFFFFFE,$FFFFFFFEFFFFFEFF,$56BCEFB5A6A6FFFF,$94D23388CD61BFEE
   Data.q $B85CBFF0AADCF542,$677B976B79916992,$7B97657B97657B97,$97657B97657B9765,$657B97657B97657B
   Data.q $7B97657B97657B97,$91677B97657B9765,$63C1F06992B86B79,$96D4358ACF68C2F0,$F263BEEEACDDF644
   Data.q $7389A564C8FA67C3,$A0B688A0B68AA2B8,$B688A0B688A0B688,$88A0B688A0B688A0,$A0B688A0B688A0B6
   Data.q $FA7389A58AA2B888,$68C0EF67C3F264C8,$9AD6378FD26CC4F1,$F067C3EFAFE0F747,$AA9EA267C8F66CC5
   Data.q $D3D4D5D3D4D9D8D8,$D4D5D3D4D5D3D4D5,$D5D4D5D5D3D4D5D3,$D7D7D8D7D7D7D6D7,$F6AB9EA2DAD9D8D7
   Data.q $6CC5F06CC5F067C8,$9DD93A93D470C9F3,$F06CC6F0B3E1F749,$B4A9AC6BCAF771C7,$D6D8D5D6D8D8D9DB
   Data.q $D8D5D6D8D5D6D8D5,$D9D9DBD5D6D8D5D6,$B6B9BCB8BAB9B7BA,$F7B5ADAFD0D0D1BB,$71C7F071C7F06BCA
   Data.q $A0DB3C97D876CCF2,$F170C8F1B5E4F84C,$BAAEB36FCCF775C9,$DCDDDBDCDDDEDFE0,$DDDBDCDDDBDCDDDB
   Data.q $E7E6E5DBDCDDDBDC,$7FA55782A63D4F65,$F7BFB5B8958F9351,$75C9F175C9F16FCC,$A6DE3F9BDA7ACEF3
   Data.q $F274CBF1B8E5F94E,$BFB4B873CEF779CD,$E0E1DFE0E1E2E3E4,$E1DFE0E1DFE0E1DF,$EBE9E7DFE0E1DFE0
   Data.q $D6FF7FD9FF5280A3,$F7C5BDC09B8F917A,$79CDF279CDF273CE,$A9E0429FDC7ED1F4,$F479CDF3BAE4FA51
   Data.q $C4B9BC77D0F97DCE,$E4E5E3E4E5E6E7E8,$E5E3E4E5E3E4E5E3,$F0ECEBE3E4E5E3E4,$D4FD80D5FB547E9F
   Data.q $F9CBC0C39C94967A,$7DCEF47DCEF477D0,$ABE244A1DF82D3F6,$F57DD1F4BCE7FB52,$C9BEC27BD3F981D2
   Data.q $E9E9E8E9E9EBECEC,$E9E8E9E9E8E9E9E8,$F5F2EFE8E9E9E8E9,$DAFF86DBFF5681A2,$F9D0C5C9A0969981
   Data.q $82D2F581D2F57BD3,$AFE443A2E08BD9F8,$F57DD3F4BEE8F954,$CDC5C87DD4F883D4,$EDEDECEDEDEFF0F0
   Data.q $EDECEDEDECEDEDEC,$F9F7F5ECEDEDECED,$B3DA71B8DC4A6983,$F8D4CACCA19B9E6A,$8BD9F784D5F57DD4
   Data.q $B3E65AABE453B4E7,$F58DD9F6D1EEFB59,$D0C8CB7CD5F980D4,$F1F1F0F1F1F3F4F4,$F1F0F1F1F0F1F1F0
   Data.q $F6F8F7F0F1F1F0F1,$9A9CA59EA0A09A9D,$F9D3CBCED4D3D5A1,$56B6E88DDAF87CD6,$ACE6FFFFFF51ABE5
   Data.q $FBD2EEFCCCEDFB49,$EBDDDBBDEBFFC0E9,$FDF9FFFDF9FFFFFB,$F9FFFDF9FFFDF9FF,$FFFEFAFFFDF9FFFD
   Data.q $FFFFFFFFFFFFFFFF,$FFECDEDBFFFFFFFF,$52AEE666BEECC5ED,$A9E5FFFFFFFFFFFF,$EB5CBBEB4CB1E742
   Data.q $69BBE75BBBEB5CBA,$BEEA6BBFEA69BBE7,$EA6BBEEA6BBEEA6B,$6BBEEA6BBEEA6BBE,$BFEA6BBEEA6BBEEA
   Data.q $EA5DAFE069BBE76B,$FFFFFF5EB6EA53B8,$FFFFFFFFFFFF
Saveend:

Sound2:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$B9E8C6E1F5FFFFFF
   Data.q $D82188D73E98DD7B,$2188D71F8AD81F8A,$E1F57BB9E83E98DD,$FFFFFFFFFFFFFFC6,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$D4E8F8FFFFFFFFFF,$8EDE1B8ADA288BD9,$E30F91E31291E116
   Data.q $0F92E30F91E30F91,$8CDB168FDF1293E1,$FFD4E8F8288BD91B,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$1F85D77DB8E7FFFF,$96E31597E41794E2,$E31696E31696E315,$1695E41698E41696
   Data.q $89DD1484DA1483D9,$E71F85D71795E313,$FFFFFFFFFFFF7DB8,$FFFFFFFFFFFFFFFF,$E3FFFFFFFFFFFFFF
   Data.q $1A9DE51F89DA6CAC,$9DE51B9DE51A9EE5,$E61B9DE51B9DE51B,$0446AF1898E41B9F,$54B6014FB6004EB6
   Data.q $DA1A9DE51CA2E90E,$FFFFFF6CACE31F89,$FFFFFFFFFFFFFFFF,$D97DB5E7FFFFFFFF,$21A4E720A6E91E89
   Data.q $A3E721A3E721A3E7,$E422A6E821A3E721,$D8EFF5003BA71D97,$50B7FFFFFFFFFFFF,$E921A4E722A8EB02
   Data.q $7DB5E71E89D920A6,$FFFFFFFFFFFFFFFF,$EA1E7ED3D4E6F6FF,$28A8E928A8E929A8,$A8E928A8E928A8E9
   Data.q $AE239FE729AAEA28,$FFFFFFD7EEF50042,$53BAFFFFFFFFFFFF,$E928A8E929ADEC02,$1E7ED329A8EA28A8
   Data.q $FFFFFFFFFFD4E6F6,$EB2DA5E72578CFFF,$30ADEA30ADEA31AE,$B1EC30ADEA30ADEA,$F5004AB52BA3E831
   Data.q $5EAADDFFFFFFD9F0,$59BEFFFFFFFFFFFF,$EA30ADEA32B2ED06,$2DA5E731AEEB30AD,$DCF2FFFFFF2578CF
   Data.q $ED3BB7EE2384D6C5,$3CB9EF3BB8EE3AB5,$97E23DBBF03CB9EF,$FFDCF0F7024DB72A,$0043B179B9E3FFFF
   Data.q $60C3FFFFFFFFFFFF,$EC39B3EC3BB8EF09,$3BB7EE39B3EC39B3,$AADFC5DCF22384D6,$E842BDEF2FA1E677
   Data.q $0D61C41B68C638A9,$67C6095BC00B5EC3,$E4FFFFFFEEF8FA0E,$0E68C71268C97BBB,$65C7FFFFFFFFFFFF
   Data.q $EE40B9EE42BEF00D,$41BBEF40B9EE40B9,$7ECD77AADF2FA1E6,$EC45BEF055C6F035,$FFFFFF0E63C53DB2
   Data.q $FFFFFFFFFFFFFFFF,$CA80C0E6FFFFFFFF,$1270CF49C5F2126B,$6DCAFFFFFFFFFFFF,$EF47BDEF4AC2F110
   Data.q $45BCEF47BDEF47BD,$64C3357ECD55C6F0,$ED63CDF39EE6FA11,$FFFFFF1D6ABE41B5,$FFFFFFFFFFFFFFFF
   Data.q $F21774D14EA6E0FF,$1475D252C9F24FC3,$72CFFFFFFFFFFFFF,$F04EC2F051C7F212,$62CBF24AC1F04DC2
   Data.q $73CC1164C39EE6FA,$F19AE1F79DE7FA1A,$FFFFFF1764BB5CC5,$FFFFFFFFFFFFFFFF,$F355CBF40C69CAFF
   Data.q $167ED55ACCF457C9,$77D3FFFFFFFFFFFF,$F255C7F25ACCF414,$98E0F768CFF351C5,$6BC4166DC89DE7FA
   Data.q $F59DE1F6A6EAFA17,$FFFFFF50C1F094DC,$FFFFFFFFFFFFFFFF,$F367D3F71074D1FF,$1A85D863D0F560CC
   Data.q $80D6FFFFFFFFFFFF,$F55ECAF360CFF518,$9CE0F6A0E2F68ADB,$59BB176BC4A6EAFA,$F4A1E3F8A9E9FA0D
   Data.q $FFFFFF4CBCED97DC,$FFFFFFFFFFFFFFFF,$F6339EE41986D9FF,$1C8ADC6AD4F66AD4,$85D9FFFFFFFFFFFF
   Data.q $F7A0E3F886DEF718,$A0E2F7A0E2F7A2E3,$6FC40D59BBA9E9FA,$F6A6E5F8ABE6F62D,$FFFFFF4CBCED9BDF
   Data.q $FFFFFFFFFFFFFFFF,$E850B0E5FFFFFFFF,$34A0E281DFF744AE,$BFEAFFFFFFFFFFFF,$F7A6E4F7ACE8F86B
   Data.q $A5E5F8A5E4F7A5E4,$9DD82D6FC4ABE6F6,$F6C7F0FB72C0E972,$64C0EB6DC2EC9CE1,$C2EB5FBCEB62BEEB
   Data.q $EDFFFFFFFFFFFE6C,$73C8ED83CFF091D1,$C0EBFFFFFFFFFFFF,$F8AAE6F8AEE8F96B,$C5F0FBA8E5F8AAE6
   Data.q $D5EE729DD872C0E9,$FBDDF7FD1F77CCC3,$B2EAFAB0EAFABEEC,$DFF5B4EBFAB3EAFA,$FFFFFEFE6DC3EC99
   Data.q $5CB9EA91D2EFFFFF,$C4EDFFFFFFFFFFFF,$F9ADE8F9B2EAFA6E,$DDF7FDBDECFAACE7,$FFFFC3D5EE1F77CC
   Data.q $FD92D6F11458B7FF,$B0E9F9C7EFFADBF5,$EBF9B2EAF9B1EAF9,$FD6EC7ED9AE1F6B5,$88D1F0FFFFFFFFFF
   Data.q $C8EEFFFFFFFFFFFF,$FAB0E9F9B5ECFA71,$92D6F1DBF5FDC7EF,$FFFFFFFFFF1458B7,$FA0E5EBDD2E0F2FF
   Data.q $D4F1FBDBF5FCC9F1,$EBFAB3EAFAC1EDFA,$EF9FE3F7B8ECFBB5,$FFFFFFFFFFFF72C9,$CCEFFFFFFFFFFFFF
   Data.q $FCD4F1FBC6EFFB75,$0E5EBDC9F1FADBF5,$FFFFFFFFFFD2E0F2,$CE759CD5FFFFFFFF,$DBF5FCD5F7FC2781
   Data.q $F0FBD6F3FBD8F3FB,$F7BDEEFAC1EEFACC,$FFFEFE72CDF09FE3,$CFF0FFFFFFFFFFFF,$FCDBF5FCDEF5FC75
   Data.q $759CD52781CED5F7,$FFFFFFFFFFFFFFFF,$CCFFFFFFFFFFFFFF,$C8F0F9267FCD5F8A,$F4FCDAF4FDDDF7FD
   Data.q $FDDAF4FCDAF4FCD9,$71CEF0D2F0FBDDF5,$E2F5ABE0F5ABE1F5,$CDC8F0F9E0F8FEB0,$FFFFFF5F8ACC267F
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$0C59B87498D0FFFF,$F8FFD9F7FC92D4F0,$FCDBF4FDDEF5FDDF
   Data.q $D8F3FCDDF4FDDAF4,$F5FBD7F4FCD7F3FC,$D00C59B892D5F0D5,$FFFFFFFFFFFF7498,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$D2DDF1FFFFFFFFFF,$BBE71D71C6104BAD,$FED2F6FDB2E6F66B,$D3F6FDDAF9FEDAF9
   Data.q $71C66CBCE7B3E6F6,$FFD2DDF1104BAD1D,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$91CDC2D1EBFFFFFF,$B70140A7255CB56D,$0140A70D57B70D57,$D1EB6D91CD255CB5
   Data.q $FFFFFFFFFFFFFFC2,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF
Sound2end:

Stop:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$CAF0D1EAF9FFFFFF
   Data.q $E83CA4E457B3E98E,$3CA4E445ADE845AD,$EAF98ECAF057B3E9,$FFFFFFFFFFFFFFD1,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$DCEFFAFFFFFFFFFF,$C8F14DB0E83EA2E2,$F78EDBF884D5F56E
   Data.q $8EDBF88DDAF78DDA,$B0E86EC8F184D5F5,$FFDCEFFA3EA2E24D,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$3EA5E08DC6EDFFFF,$D7F78AD9F877CDF2,$F784D5F785D6F687,$84D5F784D5F784D5
   Data.q $D9F887D7F785D6F6,$ED3EA5E077CDF28A,$FFFFFFFFFFFF8DC6,$FFFFFFFFFFFFFFFF,$E8FFFFFFFFFFFFFF
   Data.q $86D5F74CADE57CBB,$D3F681D3F683D4F7,$F681D3F681D3F681,$81D3F681D3F681D3,$D3F681D3F681D3F6
   Data.q $E586D5F783D4F781,$FFFFFF7CBBE84CAD,$FFFFFFFFFFFFFFFF,$E28BC1E9FFFFFFFF,$7FD1F686D5F748AA
   Data.q $D3F681D2F67FD1F6,$F681D3F681D3F681,$81D3F681D3F681D3,$D2F681D3F681D3F6,$F77FD1F67FD1F681
   Data.q $8BC1E948AAE286D5,$FFFFFFFFFFFFFFFF,$F53896D9DAEBF8FF,$7DD0F67BCEF57BCF,$B4E55AB4E56DC7EF
   Data.q $E55AB4E55AB4E55A,$5AB4E55AB4E55AB4,$B4E55AB4E55AB4E5,$F57DD0F66DC7EF5A,$3896D97BCFF57BCE
   Data.q $FFFFFFFFFFDAEBF8,$F367C0EC358DD3FF,$69C2ED75CAF376CB,$7DBC4281BE1050A4,$BC3D7DBC3D7DBC3D
   Data.q $3D7DBC3D7DBC3D7D,$81BE3D7DBC3D7DBC,$F369C2ED1050A442,$67C0EC76CBF375CA,$E3F4FFFFFF358DD3
   Data.q $F075CBF33D97D9CD,$55AEE371C8F16EC6,$FFFFFFFFFF4786C3,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$F155AEE34786C3FF,$75CBF36EC6F071C8,$B7E2CDE3F43D97D9,$EF6BC4F052B0E584
   Data.q $53AEE36BC4F069C1,$FFFFFFFFFF4888C4,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $F053AEE34888C4FF,$6BC4F069C1EF6BC4,$8DD084B7E252B0E5,$ED62BCED71C3ED45,$4FACE366BEEE64BC
   Data.q $FFFFFFFFFF4C8EC9,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$EE4FACE34C8EC9FF
   Data.q $62BCED64BCED66BE,$76C5458DD071C3ED,$EB6DC1ED9DD9F521,$4CA9E25FBAEC5BB8,$FFFFFFFFFF4F95CE
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$EC4CA9E24F95CEFF,$6DC1ED5BB8EB5FBA
   Data.q $7DC72176C59DD9F5,$EC8ECEF092D4F22B,$47A8E254B5EA65BE,$FFFFFFFFFF549BD1,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$EA47A8E2549BD1FF,$8ECEF065BEEC54B5,$75C02979C492D4F3
   Data.q $ED84C8ED8BD0F126,$3FA4E176C6ED87C9,$FFFFFFFFFF569FD6,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$ED3FA4E1569FD6FF,$84C8ED87C9ED76C6,$64B62675C08BD0F1,$EC7EC5EC84CBED1B
   Data.q $75C0E981C6ED7EC5,$FFFFFFFFFF7AB6E0,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $ED75C0E97AB6E0FF,$7EC5EC7EC5EC81C6,$79C01B64B684CBED,$EB77C3EC82C2E63A,$71BFE779C2EA78C3
   Data.q $FFFFFFFFFF93C7E6,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$EA71BFE793C7E6FF
   Data.q $77C3EC78C3EB79C2,$A4D43A79C082C2E6,$E892D1EF599FD47A,$6CBEE772C1E96FC0,$FFFFFFFFFF95CAEB
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$E96CBEE795CAEBFF,$92D1EF6FC0E872C1
   Data.q $D9ED7AA4D4599FD4,$EA9DD2EF2670BAC8,$6ABBE767BBE77AC3,$FFFFFFFFFF9DD0ED,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$E76ABBE79DD0EDFF,$9DD2EF7AC3EA67BB,$FFFFC8D9ED2670BA
   Data.q $F162A7D91D5FB0FF,$61B8E780C8EA9BD7,$D3F0A1D4F282C6EF,$F09ED3F09ED3F09E,$9ED3F09ED3F09ED3
   Data.q $D4F29ED3F09ED3F0,$EA61B8E782C6EFA1,$62A7D99BD7F180C8,$FFFFFFFFFF1D5FB0,$E2195DADD6E2F1FF
   Data.q $88CAEA92D1EF7ABD,$B7E656B6E66CC0E7,$E65BB8E65AB6E658,$5BB8E65BB8E65BB8,$B6E658B7E65AB6E6
   Data.q $EF88CAEA6CC0E756,$195DAD7ABDE292D1,$FFFFFFFFFFD6E2F1,$B5799FCEFFFFFFFF,$8ACDEC7CC3E5256C
   Data.q $C1E881C8E987C9EB,$E34FB4E35CB7E46F,$4FB4E34CB0E34CB0,$C8E96FC1E85CB7E4,$E58ACDEC87C9EB81
   Data.q $799FCE256CB57CC3,$FFFFFFFFFFFFFFFF,$C5FFFFFFFFFFFFFF,$6CB6E1226CB6648D,$C8EA80CAEA81CBEA
   Data.q $EA82C9EA81C8EA80,$82C9EA83C9EA83C9,$CAEA80C8EA81C8EA,$B66CB6E181CBEA80,$FFFFFF648DC5226C
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$1553A57699C9FFFF,$C9E974BFE34E9CD2,$E87BC6E87DC8E87B
   Data.q $7BC6E87BC6E87BC6,$BFE37BC9E97DC8E8,$C91553A54E9CD274,$FFFFFFFFFFFF7699,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$D4DFEEFFFFFFFFFF,$8AC71C61AF124E9F,$E66EBBE25CABDA3C,$6EBBE276C3E676C3
   Data.q $61AF3C8AC75CABDA,$FFD4DFEE124E9F1C,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$94C6C4D4E8FFFFFF,$A409469C2C60A971,$09469C1253A41253,$D4E87194C62C60A9
   Data.q $FFFFFFFFFFFFFFC4,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF
Stopend:

Max:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $C01A61B5FFFFFFFF,$1469BE1468BE196E,$5FB51568BE1469BF,$FFF9FAFC7FA3D21B,$FAFCFDFFFFFFFFFF
   Data.q $72C02266B69BB7DC,$BE1469BE176BC022,$155FB6146ABF1469,$FFFFFFFFFFFFFFFF,$E52A7FC9FFFFFFFF
   Data.q $199AE21899E027A8,$95CD1D85D21999E1,$FEFEFEFEDEE8F468,$FEFEFEFEFEFEFEFE,$9ED67BA3D5E6EDF7
   Data.q $E11799E132A9E450,$1776C9199CE2199A,$FFFFFFFFFFFFFFFF,$E62E81CAFFFFFFFF,$209DE21F9BE02FAA
   Data.q $E8F44581C61F8EDA,$FEFEFEFEFEFEFEDF,$FEFEFEFEFEFEFEFE,$81C5E5EDF6FEFEFE,$E11E9CE1389BDA4E
   Data.q $1C79CA209EE21F9C,$FFFFFFFFFFFFFFFF,$E73384CDFFFFFFFF,$28A2E427A2E339AE,$D5EC4385CB2798DE
   Data.q $FFFFFFFFFFFFFFC3,$FFFFFFFFFFFFFFFF,$86CCB4CBE7FFFFFF,$E429A3E42798DD3C,$217ECD29A4E429A3
   Data.q $FFFFFFFFFFFFFFFF,$E83788D0FFFFFFFF,$55B8E937A3E242B2,$8CCE2E96DC3BAFE7,$FFFFFFFFC3D7ED52
   Data.q $FFFFFFFFFFFFFFFF,$9BDE3E88CEBACFE9,$DC2E9EE131A9E62E,$2784D051B9EB439F,$FFFFFFFFFFFFFFFF
   Data.q $E23E8ED2FFFFFFFF,$579ED8387EC957AD,$9BDD43B1EA6BC2EB,$FDBAD1EB4F8FD136,$B3CDEAFBFCFEF9FB
   Data.q $AEE837A2E13988D0,$D03F87CE38A3E23C,$4191D560A9DE5490,$FFFFFFFFFFFFFFFF,$D9307ECAFFFFFFFF
   Data.q $A1C0E3E0EBF771A4,$B8EC6DC4EC5BA1D9,$EA4791D43AA1E14A,$2D86D0AFCCE9B1CD,$A8E445B4EA40ABE7
   Data.q $F8B5CEEA468ED33E,$3481CB82AFDDE8EF,$FFFFFFFFFFFFFFFF,$F787B2DFFFFFFFFF,$FFFFFFFFFFFFE0EB
   Data.q $C8EE5CA6DCA1C2E5,$D63FA5E152BCED6F,$47B0E8348CD24995,$91D543AAE44DB8ED,$FFFFFFFFAAC9E844
   Data.q $94BAE2E6EFF8FFFF,$FFFFFFFFFFFFFFFF,$FFF9FBFDFFFFFFFF,$FFFFFFFFFFFFFFFF,$A6DD9FC4E7FFFFFF
   Data.q $E55BBFEE73C9EE56,$54BEEE4CB4E849AD,$C5E84898D949AEE6,$FFFFFFFFF7FAFCA2,$FAFCFDFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FEFEFEFEFFFFFFFF,$FEFEFEFEFEFEFEFE,$C2E7F6FAFCFEFEFE,$EE67C3ED56A6DE99
   Data.q $53B7E95BC3EE5BC2,$F7FCA5C9EA4B9BDB,$FEFEFEFEFEFEFEF3,$FEFEFEFEFEFEFEFE,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$D1EEFBFDFEFFFFFF,$F05DBEED3C9ADBAF,$59B9EA65C7F064C6
   Data.q $FCFEB9D6F0509EDD,$FFFFFFFFFFFFFFFA,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FEFBFDFEFFFFFFFF
   Data.q $FEFEFEFEFEFEFEFE,$9FDEB8D8F0FEFEFE,$EE6DCCF363C4EF40,$79D0F479CDF161C1,$D6F156A5E05AB9EA
   Data.q $FEFEFEFEFAFCFEB6,$FBFDFEFEFEFEFEFE,$FFFFFFFFFFFFFFFF,$FBA7D0EEFFFFFFFF,$FEFEFEFEFEFEE9F3
   Data.q $C8F04FA8E2BEDBF2,$E363C2ED74D0F46A,$A1DFF66AB7E552AB,$ABE25EBDEB81D5F5,$FEFEFEFEBFDDF358
   Data.q $B1D5F0EDF6FBFEFE,$FFFFFFFFFFFFFFFF,$EB439FDEFFFFFFFF,$BBDBF3E8F3FB8DC5,$D3F56BC8F05CB1E6
   Data.q $EE59AFE469C6EF7A,$6DBBE89CCBEDA5CF,$C2EE86D8F6A1DFF6,$FCC8E2F562B1E564,$46A0DE9BCBEEEEF6
   Data.q $FFFFFFFFFFFFFFFF,$EB56B2E5FFFFFFFF,$5FB5E762AEE56EC1,$CBF07FD5F56ECAF0,$FDA9D3F05AB2E671
   Data.q $A0CEEFF7FBFDF4F9,$D9F7A5E0F771BDEA,$E862B1E56AC5EE88,$4CAEE561B9E97ABB,$FFFFFFFFFFFFFFFF
   Data.q $F75FB9E9FFFFFFFF,$77CFF26CC8F091DB,$B5E778CFF384D8F6,$FFF8FBFDB2D9F35F,$F7FBFDFFFFFFFFFF
   Data.q $E1F778C3ECA7D3F1,$EE74CCF28BDAF7A6,$58B8EA7ED5F467C4,$FFFFFFFFFFFFFFFF,$FA65BEEBFFFFFFFF
   Data.q $89DBF788DAF8AAE6,$DFF55DB8EA81D6F4,$FEFEFEFEFEFEFEBD,$FEFEFEFEFEFEFEFE,$C6EEAAD5F2FEFEFE
   Data.q $F888DBF7A3E0F87A,$5BBCEC8BDDF889DB,$FFFFFFFFFFFFFFFF,$F968C2ECFFFFFFFF,$8EDCF88BDAF7ABE6
   Data.q $F6FC6BBEEC77D0F3,$FEFEFEFEFEFEFEEB,$FEFEFEFEFEFEFEFE,$BBEBEFF8FDFEFEFE,$F78CDCF87ED1F368
   Data.q $5FC0EE8FDDF98CDB,$FFFFFFFFFFFFFFFF,$FA6CC6EFFFFFFFFF,$A6E5F9A6E4F9B3E9,$D2F379CDF29CE2F9
   Data.q $FFFFFFFFE9F6FC95,$FFFFFFFFFFFFFFFF,$C9F1A3D8F4EFF8FD,$FA9FE3FA94DEF876,$68C6F0A0E4FA9FE3
   Data.q $FFFFFFFFFFFFFFFF,$F254BDEDFFFFFFFF,$7BCFF27BCFF27CCF,$BCED71CBF178CEF2,$FEFAFDFEA3D9F557
   Data.q $FCFEFEFEFEFEFEFE,$C8F05ABCEDB8E2F7,$F277CEF276CDF26B,$59BEEE79CEF277CE,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF
Maxend:

Rest:
   Data.q $0000000006F64D42,$0028000000360000,$0018000000180000,$0000001800010000,$0000000006C00000
   Data.q $0000000000000000,$FFFF000000000000,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$70BA76A0D1F6F9FD
   Data.q $BB004DAA004AA633,$0954B0074FAC0261,$FFFFA0C0E34D86C8,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFF0F6FCFFFFFF,$FFFFFFFFFFFFFFFF,$588CC7FFFFFFFFFF,$81D40068C20049A6,$E20198E3019AE401
   Data.q $0D9AE4069AE40097,$5FBB177CCE158DDB,$FFFFFFFF7AA9DC15,$FFFFFFFFFFFFFFFF,$FFFF237ECFC5DDF2
   Data.q $F6FFFFFFFFFFFFFF,$0061BD004BA7E2EB,$95E00197E20190DF,$E00193E00093DF01,$199FE40F9CE30A98
   Data.q $AAEA2BAEEA22A7E7,$FA2474C82282D133,$6DAADFFFFFFFE8F2,$FFFF2E93DB2C8ED8,$A6E2EBF6FFFFFFFF
   Data.q $0198E3017CD1004A,$93DF0193DF0194E0,$E30A99E10493E000,$25A7E71DA2E5149E,$B5EC36AFEA2EABE8
   Data.q $CC3BA6E446BDF13E,$40A9E53286D11F7A,$FFFF3699DF6FD6F9,$D1004BA7FFFFFFFF,$0194DF0197E1017C
   Data.q $95E00192DF0193DF,$E816A1E50E9BE406,$2CACE925A9E81EA6,$B9EE3EB4ED34AFEA,$EE56C5F350BFF047
   Data.q $6DCFF654BAEE51BB,$FFFF379EE172D4F8,$E30061BC588CC7FF,$0093DF0194DF0198,$A1E70A99E20394E0
   Data.q $CE2D90D9178EDB13,$80C6EC63ADE23286,$BDEF68CBF29EDEF9,$F55EC7F356C3F14A,$72D0F66BCEF665CB
   Data.q $F9FD3CA4E379D7F9,$E00191DF004AA6F6,$0493E00093DF0194,$66BE1496E00B9BE2,$F48CB4DF206BBF13
   Data.q $6DA3DB9BC1E6D5E3,$E5FC76BEE91C77CA,$F566CBF45AC7F2AC,$77D4F872D2F66BCE,$A0D13FA9E582DCFB
   Data.q $DF0097E20168C276,$0F9BE40694E00192,$BFE41464BB1697E1,$FFFFFFFFFFFFFF9D,$FFFFFFFFFFFFFFFF
   Data.q $D8F51C7CCE8FBDE6,$F76DCFF666CAF491,$7FD9F978D6F973D2,$73BD44ADE889DFFC,$E20397E20185D637
   Data.q $1BA6E8129DE30A99,$FFFF8CB4DF176EC5,$FFFFFFFFFFFFFFFF,$5BA1DBFFFFFFFFFF,$CBF596DFFA52A8E1
   Data.q $F971D2F76DCFF55F,$85DCFA80DAFA7AD7,$55AF46B1EA90E3FE,$E30B86D4096DC507,$24A0E41FA8E91599
   Data.q $FFFFFFFFFF256FC1,$FAFFFFFFFFFFFFFF,$3492D9227ECFE7F2,$EFFED3F1FFA6DEF6,$FA9EE1FCB7E8FED1
   Data.q $88DFFC81DCFB80DB,$FFFF4AB7ED92E4FD,$C9BCD2EBEAF1F9FF,$1E77CA196EC34883,$FFFFFFFFFF669DD8
   Data.q $FFFFFFFFFFFFFFFF,$C2DEF3FFFFFFFFFF,$ADE63C97DC81BBE8,$FFB6E4FA82CCF14D,$BEECFFD2F2FFE3F6
   Data.q $55AD4BBBEFAFEBFF,$FFFFFFFFBBCEE80D,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$E77BBFEDB8DCF5FF,$99DBF666C3EF40AB,$76C464C6F2CEEEFE
   Data.q $CF60B0E360B0E322,$6598D23288CF3288,$FFFFFFFFFFAECAE8,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF,$5BB54BBBF1B1E1F8,$F863CAF02BB3EB00
   Data.q $96D4F2CAF0FF9FE1,$7CCB368FD567B1E5,$FFC1DAF17CAFE02E,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFFFFFF
   Data.q $E842ADE778BEEBFF,$FFFFFF61BAEC3EAA,$5FBBFFFFFFFFFFFF,$E30695E00195E203,$5DC5EF1CA3E50D9A
   Data.q $EDFEBEEBFD90D8F6,$D2328FD79EDAF5C7,$FFFFFFE8F2FB2483,$FFFFFFFFFFFFFFFF,$FE81DDFA3CA2E3FF
   Data.q $73D5F98EE3FC96E6,$61BC41B8EF75D0F4,$E40F9AE30699E206,$2AA9E723A4E7199F,$D5F532B0EC31ABEA
   Data.q $FF5CA1DD4FA5DF7F,$FFFFFFFFFFFFFFFF,$CFF1FFFFFFFFFFFF,$FC91E4FE3EABE79A,$B0EAFF92E5FE91E4
   Data.q $65BD65C6F3BAE8FC,$E5129CE3099CE209,$31ADE927A7E71BA1,$78CC7CCFF236AFEB,$FFFFFFFF8EBDE71A
   Data.q $FFFFFFFFFFFFFFFF,$9FE3A9D6F2FFFFFF,$FD8FE1FC7DDAFA32,$D1F2FF8FE3FE92E3,$66C199D9F77CD4F6
   Data.q $E6149EE3099CE30A,$35AEEA29A8E71EA2,$BEE9A1DFF936B0EA,$EF74B2E52283D277,$98CBEFD8EBF9A1CD
   Data.q $D7F738A3E43A9EE0,$FD8EE0FC8DE1FD79,$D5F0FFAAE8FE8FE2,$69C2F9FDFF38B5EF,$E7189FE40C9CE50D
   Data.q $36AFEA2CABE923A5,$CCF440B6ED3EB3ED,$EC8FCFF2A9E4F96D,$5EBEEE4DAAE576C3,$DEFB85DEFC64C9F1
   Data.q $FE8CE0FC8BE0FC87,$6ECEF4DFF5FF9BE5,$6BC3FFFFFF83D1F5,$E11BA4E70E9DE50F,$39B3EC35A7E71F9A
   Data.q $BEF048BAEE40B5ED,$F55DC7F352C2F04E,$76D5F871D1F768CC,$DDFB80DAFA7DD8FA,$FF9BE4FD88DFFC85
   Data.q $3BB6EFAAE3FBD3F2,$6FC5FFFFFFFFFFFF,$C71B88D712A4E812,$43A9E52478CB2F79,$C0F04ABCEE43BAEF
   Data.q $F563C9F45AC5F252,$77D4F871D2F66ACD,$DDFB7FDAFA7DD8F9,$FBDEF5FFA3E7FD83,$EAF8FE38B5EFAAE4
   Data.q $71C7FFFFFFFFFFFF,$FF6AA0D81872C813,$277ECEE9F2FAFFFF,$C6F26DCBF343A0DF,$F460C9F459C7F25C
   Data.q $73D5F76ED1F767CC,$EFFF98E0FB78D7F8,$EF6ECEF4D4F0FECD,$FFFFFFEAF8FE3BB6,$69BFFFFFFFFFFFFF
   Data.q $FFFFFFFFC2D8EF18,$FFFFFFFFFFFFFFFF,$BBE92183D481B8E6,$FB99DFF885D0F36A,$BCEBFEABE5FCA9E5
   Data.q $CFF4AFE3FAD8F3FF,$FF83D1F538B4EF79,$FFFFFFFFFFFFFFFF,$F5FBFFFFFFFFFFFF,$FFFFFFFFFFFFFFEF
   Data.q $FFFFFFFFFFFFFFFF,$D3F1FFFFFFFFFFFF,$E12C95DE62AFE6AB,$38A9E75BB9ED2B98,$D8F660BFF034A9E8
   Data.q $FFFFFFFFF9FDFF99,$FFFFFFFFFFFFFFFF,$FFFFFFFFFFFF
Restend:
EndDataSection

Egypt my love
rsts
Addict
Addict
Posts: 2736
Joined: Wed Aug 24, 2005 8:39 am
Location: Southwest OH - USA

Re: Media Player [Windows]

Post by rsts »

Wow.

Very nice. :D
User avatar
VB6_to_PBx
Enthusiast
Enthusiast
Posts: 617
Joined: Mon May 09, 2011 9:36 am

Re: Media Player [Windows]

Post by VB6_to_PBx »

RASHAD ,

Thank you very much for Posting this code example ,
and all your other great source code examples !!!
- much appreciated .
 
PureBasic .... making tiny electrons do what you want !

"With every mistake we must surely be learning" - George Harrison
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4637
Joined: Sun Apr 12, 2009 6:27 am

Re: Media Player [Windows]

Post by RASHAD »

@rsts
Thank you very much my old friend
Your comments are always welcomed
I am waiting :)

@VB6_to_PBx
Thanks mate
Your are welcome
Egypt my love
User avatar
oreopa
Enthusiast
Enthusiast
Posts: 281
Joined: Sat Jun 24, 2006 3:29 am
Location: Edinburgh, Scotland.

Re: Media Player [Windows]

Post by oreopa »

Hey thats a very nice example. Definetly one for my archives. :D Thanx!
Proud supporter of PB! * Musician * C64/6502 Freak
User avatar
falsam
Enthusiast
Enthusiast
Posts: 630
Joined: Wed Sep 21, 2011 9:11 am
Location: France
Contact:

Re: Media Player [Windows]

Post by falsam »

Rashad thank you very much for this wonderful code. I archive this code.

➽ Windows 11 64-bit - PB 6.0 x64 - AMD Ryzen 7 - NVIDIA GeForce GTX 1650 Ti

Sorry for my bad english and the Dunning–Kruger effect.
SFSxOI
Addict
Addict
Posts: 2970
Joined: Sat Dec 31, 2005 5:24 pm
Location: Where ya would never look.....

Re: Media Player [Windows]

Post by SFSxOI »

Great job Rashad :)

(Its screaming for some basic editing tools to be included)
The advantage of a 64 bit operating system over a 32 bit operating system comes down to only being twice the headache.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4637
Joined: Sun Apr 12, 2009 6:27 am

Re: Media Player [Windows]

Post by RASHAD »

@oreopa
@falsam
@SFSxOI
Thank you guys
Much appreciated

Next is a revised version for Part #1

Code: Select all

Global hwnd,TTime.d,Frames,OldPos,im,Vol,fps,Run,Result,Media,ti$
im = 100

UseJPEGImageEncoder()
UsePNGImageEncoder()


#TBS_TOOLTIPS         = $0100
#CAPTUREBLT           = $40000000

#S_OK  = 0
#OATRUE = -1
#OAFALSE = 0

#CLSCTX_INPROC_SERVER  = $01
#CLSCTX_INPROC_HANDLER = $02
#CLSCTX_LOCAL_SERVER   = $04
#CLSCTX_REMOTE_SERVER  = $10

#CLSCTX_ALL    = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
#CLSCTX_INPROC = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER
#CLSCTX_SERVER = #CLSCTX_INPROC_SERVER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER

#MAX_FILTER_NAME = 128

#WM_GRAPHEVENT = #WM_USER+1

#EC_COMPLETE  = 1

#VMRMode_Windowed   = $1
#VMRMode_Windowless = $2
#VMRMode_Renderless = $4 
#VMRMode_Mask       = $7

#RenderPrefs_ForceOffscreen               = $00000001
#RenderPrefs_ForceOverlays                = $00000002
#RenderPrefs_AllowOverlays                = $00000000
#RenderPrefs_AllowOffscreen               = $00000000
#RenderPrefs_DoNotRenderColorKeyAndBorder = $00000008
#RenderPrefs_RestrictToInitialMonitor     = $00000010
#RenderPrefs_PreferAGPMemWhenMixing       = $00000020
#RenderPrefs_Mask                         = $0000003F

;{ Flag options / renderers
#Default = 0

#VMR9_Windowed       = 1 << 0     
#VMR9_Windowless     = 1 << 1
#VMR7_Windowed       = 1 << 2
#VMR7_Windowless     = 1 << 3
#OldVideoRenderer    = 1 << 4     
#OverlayMixer        = 1 << 5

#WaveOutRenderer     = 1 << 6
#DirectSoundRenderer = 1 << 7 

#VMR7_ForceOverlays  = 1 << 8
#VMR7_ForceOffscreen = 1 << 9
#DontKeepAR          = 1 << 10
;}

Enumeration ; MediaState
  #State_Stopped
  #State_Paused
  #State_Running
EndEnumeration

Enumeration ; MediaInfo
  #MEDIA_LENGTH
  #MEDIA_FPS
  #MEDIA_WIDTH
  #MEDIA_HEIGHT
  #MEDIA_POSITION
  #MEDIA_ASPECTRATIO_NUM
  #MEDIA_ASPECTRATIO_DEN
  #MEDIA_ASPECTRATIO
  #MEDIA_STATE
  #MEDIA_TIME_FRAMES
  #MEDIA_TIME_MSECS
EndEnumeration


Enumeration ; MediaSeeking
  #AM_SEEKING_NoPositioning        
  #AM_SEEKING_AbsolutePositioning
EndEnumeration

Interface IGraphBuilder_forceUnicode
  QueryInterface(a, b)
  AddRef()
  Release()
  AddFilter(a, b.p-unicode)
  RemoveFilter(a)
  EnumFilters(a)
  FindFilterByName(a.p-unicode, b)
  ConnectDirect(a, b, c)
  Reconnect(a)
  Disconnect(a)
  SetDefaultSyncSource()
  Connect(a, b)
  Render(a)
  RenderFile(a.p-unicode, b)
  AddSourceFilter(a.p-unicode, b.p-unicode, c)
  SetLogFile(a)
  Abort()
  ShouldOperationContinue()
EndInterface

Structure Dshow_Interfaces
  Object.l
  pGraphBuilder.IGraphBuilder_forceUnicode
  pControl.IMediaControl
  pEvent.IMediaEventEx
  pWindow.IVideoWindow
  pAudio.IBasicAudio
  pVideo.IBasicVideo2
  pSeeking.IMediaSeeking
  pMediaPosition.IMediaPosition
  pSampleGrabber.ISampleGrabber
  thread.l
  fullscreen.l
  hwnd.i
  drain.l
  aspectRatio.f
  width.l
  widthPAR.l
  height.l
  renderer.l
EndStructure

CompilerIf Defined(FILTER_INFO, #PB_Structure) = #False
  Structure FILTER_INFO ; an official Dshow structure - actually missing in PB
    achName.w[#MAX_FILTER_NAME]
    *pGraph.IFilterGraph 
  EndStructure
CompilerEndIf

CompilerIf Defined(CAUUID, #PB_Structure) = #False
  Structure CAUUID
    cElems.l
    *pElems  
  EndStructure
CompilerEndIf


CompilerIf Defined(IEnumFilters, #PB_Interface) = #False
  Interface IEnumFilters
    QueryInterface(a, b)
    AddRef()
    Release()
  Next(a, b, c)
    Skip(a)
    Reset()
    Clone(a)
  EndInterface
CompilerEndIf

Macro FAILED(Status)
  Status < 0
EndMacro

Macro SUCCEEDED(Status)
  Status >= 0
EndMacro

Macro _SafeRelease(__Object)
  If __Object
    __Object\Release()
    __Object = #Null
  EndIf 
EndMacro

Macro _GetMediaObject(_Object_)
  Protected _Object_#.Dshow_Interfaces = Object_GetObject(g_DshowObjects, Object)
  If Not _Object_#
    ;Debug "Fatal Error: The given media no. hasn't been initialized!"
    ;CallDebugger
    ProcedureReturn #False
  EndIf
EndMacro

Macro CHECK_(in)
  CompilerIf #PB_Compiler_Debugger
    If Not SUCCEEDED(in#)
      ;Debug "Not succeeded at line " + Str(#PB_Compiler_Line)
      ;CallDebugger
    EndIf
  CompilerElse
    in#
  CompilerEndIf
EndMacro

Macro DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) 
  Global name.GUID
  name\Data1 = l
  name\Data2 = w1
  name\Data3 = w2
  name\Data4[0] = b1
  name\Data4[1] = b2
  name\Data4[2] = b3
  name\Data4[3] = b4
  name\Data4[4] = b5
  name\Data4[5] = b6
  name\Data4[6] = b7
  name\Data4[7] = b8
EndMacro

;{ GUIDS
DEFINE_GUID(IID_IGraphBuilder,          $56A868A9, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaControl,          $56A868B1, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaEventEx,          $56A868C0, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IMediaSeeking,          $36B73880, $C2C8, $11CF, $8B, $46, $00, $80, $5F, $6C, $EF, $60)
DEFINE_GUID(IID_IMediaPosition,         $56a868b2, $0ad4, $11ce, $b0, $3a, $00, $20, $af, $0b, $a7, $70)
DEFINE_GUID(IID_IVideoWindow,           $56A868B4, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IBasicAudio,            $56A868B3, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IBasicVideo,            $56A868B5, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
;DEFINE_GUID(IID_IMediaSeeking,          $36B73880, $C2C8, $11CF, $8B, $46, $00, $80, $5F, $6C, $EF, $60)
DEFINE_GUID(IID_IBaseFilter,            $56A86895, $0AD4, $11CE, $B0, $3A, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(IID_IVMRFilterConfig9,      $5A804648, $4F66, $4867, $9C, $43, $4F, $5C, $82, $2C, $F1, $B8)
DEFINE_GUID(IID_IVMRWindowlessControl9, $8F537D09, $F85E, $4414, $B2, $3B, $50, $2E, $54, $C7, $99, $27)
DEFINE_GUID(IID_IVMRFilterConfig,       $9E5530C5, $7034, $48B4, $BB, $46, $0B, $8A, $6E, $FC, $8E, $36)
DEFINE_GUID(IID_IVMRWindowlessControl,  $0EB1088C, $4DCD, $46F0, $87, $8F, $39, $DA, $E8, $6A, $51, $B7)
DEFINE_GUID(IID_IVMRAspectRatioControl, $EDE80B5C, $BAD6, $4623, $B5, $37, $65, $58, $6C, $9F, $8D, $FD)
DEFINE_GUID(IID_IVMRAspectRatioControl9,$00D96C29, $BBDE, $4EFC, $99, $01, $BB, $50, $36, $39, $21, $46)
DEFINE_GUID(IID_ISpecifyPropertyPages,  $B196B28B, $BAB4, $101A, $B6, $9C, $00, $AA, $00, $34, $1D, $07)
DEFINE_GUID(IID_IUnknown,               $00000000, $0000, $0000, $C0, $00, $00, $00, $00, $00, $00, $46)

DEFINE_GUID(IID_IDvdGraphBuilder,       $FCC152B6, $F372, $11D0, $8E, $00, $00, $C0, $4F, $D7, $C0, $8B)
DEFINE_GUID(IID_IDvdControl2,           $33BC7430, $EEC0, $11D2, $82, $01, $00, $A0, $C9, $D7, $48, $42)
DEFINE_GUID(IID_IDvdInfo2,              $34151510, $EEC0, $11D2, $82, $01, $00, $A0, $C9, $D7, $48, $42)

DEFINE_GUID(CLSID_FilterGraph,          $E436EBB3, $524F, $11CE, $9F, $53, $00, $20, $AF, $0B, $A7, $70)
DEFINE_GUID(CLSID_VideoMixingRenderer,  $B87BEB7B, $8D29, $423F, $AE, $4D, $65, $82, $C1, $01, $75, $AC)
DEFINE_GUID(CLSID_VideoMixingRenderer9, $51B4ABF3, $748F, $4E3B, $A2, $76, $C8, $28, $33, $0E, $92, $6A)
DEFINE_GUID(CLSID_OverlayMixer,         $CD8743A1, $3736, $11D0, $9E, $69, $00, $C0, $4F, $D7, $C1, $5B)
DEFINE_GUID(CLSID_VideoRenderer,        $70E102B0, $5556, $11CE, $97, $C0, $00, $AA, $00, $55, $59, $5A)
DEFINE_GUID(CLSID_AudioRender,          $E30629D1, $27E5, $11CE, $87, $5D, $00, $60, $8C, $B7, $80, $66)
DEFINE_GUID(CLSID_DSoundRender,         $79376820, $07D0, $11CF, $A2, $4D, $00, $20, $AF, $D7, $97, $67)
DEFINE_GUID(TIME_FORMAT_MEDIA_TIME,     $7B785574, $8C82, $11CF, $BC, $0C, $00, $AA, $00, $AC, $74, $F6)
DEFINE_GUID(TIME_FORMAT_FRAME,          $7B785570, $8C82, $11CF, $BC, $0C, $00, $AA, $00, $AC, $74, $F6)
;}

Import "ObjectManager.lib"
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
    Object_GetOrAllocateID(*Objects, Object.l) As "_PB_Object_GetOrAllocateID@8"
    Object_GetObject(*Objects, Object.l) As "_PB_Object_GetObject@8"
    Object_IsObject(*Objects, Object.l) As "_PB_Object_IsObject@8"
    Object_FreeID(*Objects, Object.l) As "_PB_Object_FreeID@8"
    Object_Init(structuresize.l, IncrementStep.l, *ObjectFreeFunction) As "_PB_Object_Init@12"
  CompilerElse
    Object_GetOrAllocateID(*Objects, Object.l) As "PB_Object_GetOrAllocateID"
    Object_GetObject(*Objects, Object.l) As "PB_Object_GetObject"
    Object_IsObject(*Objects, Object.l) As "PB_Object_IsObject"
    Object_FreeID(*Objects, Object.l) As "PB_Object_FreeID"
    Object_Init(structuresize.l, IncrementStep.l, *ObjectFreeFunction) As "PB_Object_Init"
  CompilerEndIf
EndImport:IsWindow(#PB_Any)

Global g_DshowObjects.l
Global NewList filters.s()


Procedure GetFilterProperties(Object.l, filterName.s)
  _GetMediaObject(*object)  
  Protected *pFilter.IBaseFilter, *pProp.ISpecifyPropertyPages, FilterInfo.FILTER_INFO, *pFilterUnk.IUnknown, caGUID.CAUUID
  If *object\pGraphBuilder\FindFilterByName(filterName,  @*pFilter) = #S_OK ;: Debug "1"
    If *pFilter\QueryInterface(@IID_ISpecifyPropertyPages, @*pProp) = #S_OK ;: Debug "2"
      *pFilter\QueryFilterInfo(@FilterInfo) ;: Debug "3"
      *pFilter\QueryInterface(@IID_IUnknown, @*pFilterUnk) ;: Debug "4"
      *pProp\GetPages(@caGUID) ;: Debug "5"
      *pProp\Release() ;: Debug "6"
      OleCreatePropertyFrame_(*object\hwnd, 0, 0, @FilterInfo\achName, 1, @*pFilterUnk, caGUID\cElems, caGUID\pElems, 0, 0, #Null) ;: Debug "7"
      *pFilterUnk\Release()
      FilterInfo\pGraph\Release()
      CoTaskMemFree_(caGUID\pElems)
      ProcedureReturn #True
    EndIf
  EndIf 
EndProcedure

Procedure _DeleteInterfaces(Object.l)
  _GetMediaObject(*object)
  _SafeRelease(*object\pControl)
  _SafeRelease(*object\pEvent)
  _SafeRelease(*object\pWindow)
  _SafeRelease(*object\pAudio)
  _SafeRelease(*object\pVideo)
  _SafeRelease(*object\pSeeking)
  _SafeRelease(*object\pMediaPosition)
  ;_SafeRelease(*object\pSampleGrabber)
 ;_SafeRelease(*object\pGraphBuilder)

  ProcedureReturn #True
EndProcedure

Procedure _BuildInterfaces(Object.l)
  _GetMediaObject(*object)
  Protected a.l, b.l, c.l, d.l, e.l, f.l ,g.l,h.l
 If CoCreateInstance_(@CLSID_FilterGraph, #Null, #CLSCTX_INPROC_SERVER, @IID_IGraphBuilder, @*object\pGraphBuilder) <> #S_OK
    ;CoCreateInstance_(@CLSID_SampleGrabber, #Null, #CLSCTX_INPROC_SERVER, @IID_IBaseFilter, @*object\pSampleGrabber); <> #S_OK 
     ;Debug "Error: Couldn't initialize the GraphBuilder Interface"
     ;CallDebugger
     ProcedureReturn #False
   Else
    *object\Object = #True
    a = *object\pGraphBuilder\QueryInterface(@IID_IMediaControl, @*object\pControl)
    b = *object\pGraphBuilder\QueryInterface(@IID_IMediaEventEx, @*object\pEvent)
    c = *object\pGraphBuilder\QueryInterface(@IID_IVideoWindow,  @*object\pWindow)
    d = *object\pGraphBuilder\QueryInterface(@IID_IBasicAudio,   @*object\pAudio)
    e = *object\pGraphBuilder\QueryInterface(@IID_IBasicVideo,   @*object\pVideo)
    f = *object\pGraphBuilder\QueryInterface(@IID_IMediaSeeking, @*object\pSeeking)
    g = *object\pGraphBuilder\QueryInterface(@IID_IMediaPosition, @*object\pMediaPosition)    
    ;h = *object\pGraphBuilder\QueryInterface(@IID_ISampleGrabber, @*object\pSampleGrabber)
    If SUCCEEDED(a) And SUCCEEDED(b) And SUCCEEDED(c) And SUCCEEDED(d) And SUCCEEDED(e) And SUCCEEDED(f) And SUCCEEDED(g); And SUCCEEDED(h); Quick check
      ProcedureReturn #True
    Else
      _DeleteInterfaces(Object)
      ;Debug "Error: Query of at least one of the needed Interfaces failed"
      ;CallDebugger
      ProcedureReturn #False
    EndIf
  EndIf 
EndProcedure

Procedure ResizeMedia(Object.l, x.l, y.l, width.l, height.l , keepAR.l = #True)
  ;x = 8 : y = 8: width - 10 : height - 75
  _GetMediaObject(*object)
  If x > #PB_Default
    *object\pWindow\put_Left(x)
  EndIf
  If y > #PB_Default
    *object\pWindow\put_Top(y)
  EndIf
  If width > #PB_Default
    *object\pVideo\put_DestinationWidth(width)
    *object\pWindow\put_width(width)
    *object\width = width
  EndIf
  If height > #PB_Default
    If keepAR
      *object\pVideo\put_DestinationHeight(width/*object\aspectRatio)
      *object\pVideo\put_Destinationtop((height/2)-(width/*object\aspectRatio)/2)
    Else
      *object\pVideo\put_DestinationHeight(height)
      *object\pVideo\put_Destinationtop(0)
    EndIf 
    *object\pWindow\put_Height(height)
    *object\height = height
  EndIf
  ;BringWindowToTop_(*object\pWindow)
EndProcedure

Procedure LoadMedia(Object.l, filename.s, Parent=0, flags.l = #VMR7_Windowed)
  _GetMediaObject(*object)
  Protected pVmr.IBaseFilter, pVidRend.IBaseFilter, pAudR.IBaseFilter, pFilter.IBaseFilter
  Protected pEnum.IEnumFilters, pVMRCnfg.IVMRFilterConfig, pWc.IVMRWindowlessControl, PAR.IVMRAspectRatioControl
  Protected VMR.b, pIndividualRenderer, RendName.s, pFltrCnfg, pWndCntrl, pARControl, vw, vh, ax, ay, cFetched, ar.f
  Protected FilterInfo.FILTER_INFO
 
  ;Debug UCase(GetFilePart(filename))
 
;   If UCase(GetFilePart(filename)) = "VIDEO_TS.IFO"
;     ;Debug "yes"
;   EndIf
  _BuildInterfaces(Object)
  *object\renderer = 0
 
  If flags & #VMR9_Windowed Or flags & #VMR9_Windowless Or flags & #VMR7_Windowed Or flags & #VMR7_Windowless Or flags & #OldVideoRenderer Or flags & #OverlayMixer ;VidRenderer
    If flags & #VMR9_Windowed Or flags & #VMR9_Windowless
      *object\renderer | #VMR9_Windowed
      pIndividualRenderer = @CLSID_VideoMixingRenderer9 : RendName = "Video Mixing Renderer 9"
    ElseIf flags & #VMR7_Windowed Or flags & #VMR7_Windowless
      *object\renderer | #VMR7_Windowed
      pIndividualRenderer = @CLSID_VideoMixingRenderer  : RendName = "Video Mixing Renderer 7"
    ElseIf flags & #OverlayMixer
      *object\renderer | #OverlayMixer
      pIndividualRenderer = @CLSID_OverlayMixer         : RendName = "Overlay Mixer"
    ElseIf flags & #OldVideoRenderer
      *object\renderer | #OldVideoRenderer
      pIndividualRenderer = @CLSID_VideoRenderer        : RendName = "Old Video Renderer"
    EndIf
   
    If CoCreateInstance_(pIndividualRenderer, #Null, #CLSCTX_INPROC, @IID_IBaseFilter, @pVidRend) = #S_OK
      If *object\pGraphBuilder\AddFilter(pVidRend, RendName) = #S_OK
        VMR = #False
        If flags & #VMR9_Windowed Or flags & #VMR9_Windowless
          pFltrCnfg = @IID_IVMRFilterConfig9
          pWndCntrl = @IID_IVMRWindowlessControl9
          pARControl= @IID_IVMRAspectRatioControl9
          VMR = #True
        ElseIf flags & #VMR7_Windowed Or flags & #VMR7_Windowless
          pFltrCnfg = @IID_IVMRFilterConfig
          pWndCntrl = @IID_IVMRWindowlessControl
          pARControl= @IID_IVMRAspectRatioControl
          VMR = #True
        EndIf
        If VMR
          If pVidRend\QueryInterface(pFltrCnfg, @pVMRCnfg) = #S_OK
            If flags & #VMR9_Windowed Or flags & #VMR7_Windowed
              CHECK_(pVMRCnfg\SetRenderingMode(#VMRMode_Windowed))
              If flags & #VMR7_ForceOverlays
                CHECK_(pVMRCnfg\SetRenderingPrefs(#RenderPrefs_ForceOverlays))
              ElseIf flags & #VMR7_ForceOffscreen
                CHECK_(pVMRCnfg\SetRenderingPrefs(#RenderPrefs_ForceOffscreen))
              EndIf
              If flags & #DontKeepAR
                If pVidRend\QueryInterface(pARControl, @PAR) = #S_OK
                  CHECK_(PAR\SetAspectRatioMode(0))
                  PAR\Release()
                EndIf
              EndIf
            ElseIf flags & #VMR9_Windowless Or flags & #VMR7_Windowless
              CHECK_(pVMRCnfg\SetRenderingMode(#VMRMode_Windowless))
              If pVidRend\QueryInterface(@pWndCntrl, @pWc) = #S_OK And Parent
                CHECK_(pWc\SetVideoClippingWindow(Parent))
                CHECK_(pWc\SetAspectRatioMode(0))
                pWc\Release()
              EndIf
            EndIf
            pVMRCnfg\Release()
          Else
            ;Debug "Error: Getting Interface for VMR Config failed"
          EndIf
        EndIf
      Else
        ;Debug "Error: Adding Individual video render filter failed" 
      EndIf
      pVidRend\Release()
    Else
      ;Debug "Error: Couldn't Create Instance of individual video renderer"
    EndIf
  EndIf
 
  RendName = ""
  If flags & #WaveOutRenderer
    RendName = "AudioWaveOut Renderer"
    pIndividualRenderer = @CLSID_AudioRender
  ElseIf flags & #DirectSoundRenderer
    RendName = "DirectSound Renderer"
    pIndividualRenderer = @CLSID_DSoundRender
  EndIf
  If RendName
    If CoCreateInstance_(pIndividualRenderer, #Null, #CLSCTX_INPROC, @IID_IBaseFilter, @pAudR) = #S_OK
      If *object\pGraphBuilder\AddFilter(pAudR, RendName) = #S_OK
        pAudR\Release()
      Else
        ;Debug "Error: Adding Individual audio render filter failed"
      EndIf
    Else
      ;Debug "Error: Couldn't Create Instance of individual audio renderer"
    EndIf
  EndIf
  If *object\pGraphBuilder\RenderFile(filename, #Null) = #S_OK
   
    If Parent
      *object\hwnd = Parent
      *object\pVideo\get_SourceWidth(@vw)
      *object\pVideo\get_SourceHeight(@vh)
      *object\pVideo\GetPreferredAspectRatio(@ax, @ay)
     
      If ax And ay
        *object\aspectRatio = ax/ay
        *object\widthPAR = (vh * *object\aspectRatio); * 0.70
        vw = *object\widthPAR
        ;Debug "aspektRatio  : "+StrF(*object\aspectRatio,3)
        ;Debug "WidthPAR  : "+Str(vw)
      EndIf
     
      *object\width = vw
      *object\height = vh
      ResizeMedia(Object, 0, 0, vw, vh)
      CHECK_(*object\pWindow\put_Owner(*object\hwnd))
      CHECK_(*object\pWindow\put_WindowStyle(#WS_CHILD|#WS_CLIPSIBLINGS|#WS_CLIPCHILDREN))
      CHECK_(*object\pWindow\put_Visible(#OATRUE))
      UpdateWindow_(*object\hwnd)
      SetForegroundWindow_(*object\hwnd)
      SetFocus_(*object\hwnd)
    EndIf
   
    If *object\pEvent\SetNotifyWindow(Parent, #WM_GRAPHEVENT, Object.l) = #S_OK
      If *object\pEvent\SetNotifyFlags(0) <> #S_OK
      EndIf
    Else
      ;Debug "Info: Media notification callback has not been applied"
    EndIf
    If *object\pGraphBuilder\EnumFilters(@pEnum) = #S_OK
      ;Debug " "
      ;Debug "--------- Filtergraph ---------"
      While pEnum\Next(1, @pFilter, @cFetched) = #S_OK
      pFilter\QueryFilterInfo(@FilterInfo)
      AddElement(filters())
      ;Debug PeekS(@FilterInfo\achName, #MAX_FILTER_NAME, #PB_Unicode)
      filters() = PeekS(@FilterInfo\achName, #MAX_FILTER_NAME, #PB_Unicode)
      If FilterInfo\pGraph <> #Null
        FilterInfo\pGraph\Release()
      EndIf
      pFilter\Release()
    Wend
    ;Debug "--------------------------------------"
    ;Debug " "
  Else
    ;Debug "Error: Could not enumerate filters"
  EndIf
  *object\pSeeking\SetTimeFormat(@TIME_FORMAT_MEDIA_TIME)
  *object\pGraphBuilder\Release()

  ProcedureReturn #True
Else
  ;Debug "Error: Rendering file failed"
  ProcedureReturn #False
EndIf

EndProcedure

Procedure PutRate(Object.l,rate.f)
  _GetMediaObject(*object)
  ProcedureReturn *object\pMediaPosition\put_Rate(rate)
EndProcedure

Procedure PlayMedia(Object.l)
  _GetMediaObject(*object)
  ProcedureReturn *object\pControl\run()
EndProcedure

Procedure PauseMedia(Object.l)
  _GetMediaObject(*object)
  ProcedureReturn *object\pControl\pause()
EndProcedure

Procedure MediaSeek(Object.l, pos.q)
  _GetMediaObject(*object)
  Protected duration.q
  pos * 10000
  *object\pSeeking\GetDuration(@duration) 
  ProcedureReturn *object\pSeeking\SetPositions(@pos, #AM_SEEKING_AbsolutePositioning,@duration, #AM_SEEKING_NoPositioning)
EndProcedure

Procedure MediaStop(Object.l)
  _GetMediaObject(*object)
  ProcedureReturn *object\pControl\stop()
EndProcedure

Procedure MediaLenght(Object.l, mode.l)
  _GetMediaObject(*object)
  Protected duration.q, avgTimePerFrame.d
  *object\pSeeking\GetDuration(@duration)
  If mode = #MEDIA_TIME_MSECS
    ProcedureReturn duration/10000 
  ElseIf mode = #MEDIA_TIME_FRAMES
    *object\pVideo\get_AvgTimePerFrame(@avgTimePerFrame)
    If avgTimePerFrame > 0
      ProcedureReturn (duration/10000) / (avgTimePerFrame*1000)
    EndIf 
  EndIf
EndProcedure

Procedure MediaWidth(Object.l)
  _GetMediaObject(*object) 
  ProcedureReturn *object\width 
EndProcedure

Procedure MediaHeight(Object.l, height.l = #PB_Default)
  _GetMediaObject(*object)
  ProcedureReturn *object\height
EndProcedure

Procedure MediaPosition(Object.l, mode.l)
  _GetMediaObject(*object)
  Protected pos.q, avgTimePerFrame.d
  *object\pSeeking\GetCurrentPosition(@pos)
  If mode = #MEDIA_TIME_MSECS
    ProcedureReturn pos/10000 ; result in ms
  ElseIf mode = #MEDIA_TIME_FRAMES
    *object\pVideo\get_AvgTimePerFrame(@avgTimePerFrame)
    If avgTimePerFrame > 0
      ProcedureReturn (pos/10000) / (avgTimePerFrame*1000)
    EndIf
  EndIf 
EndProcedure

Procedure MediaState(Object.l)
  _GetMediaObject(*object)
  Protected pfs.l
  *object\pControl\GetState(10,@pfs)
  ProcedureReturn pfs
EndProcedure

Procedure.f MediaFPS(Object.l)
  _GetMediaObject(*object)
  Protected avgTimePerFrame.d
  *object\pVideo\get_AvgTimePerFrame(@avgTimePerFrame)
  If avgTimePerFrame > 0
    ProcedureReturn 1/avgTimePerFrame 
  Else
    ProcedureReturn #False
  EndIf 
EndProcedure

Procedure OnMediaEvent(Object.l)
  _GetMediaObject(*object)
  Protected EventCode.l, Param1.l, Param2.l
  While *object\pEvent\GetEvent(@EventCode, @Param1, @Param2, 0) <> #E_ABORT
    Select EventCode
      Case #EC_COMPLETE
        *object\pControl\stop() ; If an #EC_COMPLETE notify occurs we do change the media state to stopped
        ;Debug "... end has been reached."
    EndSelect
    *object\pEvent\FreeEventParams(EventCode, Param1, Param2)
  Wend
EndProcedure

Procedure.s MediaTime2String(time.l)
  Protected ti.s, SS, MM, HH, ms
  ms = time%1000
  SS = Int(time / 1000) : While SS > 59:SS-60:Wend 
  MM = Int(time / 1000 / 60) : While MM > 59:MM-60:Wend 
  HH = Int(time / 1000 / 60 / 60) : While HH > 59:HH-60:Wend
  ti$ =RSet(StrU(HH,2),2,"0")+":"+RSet(StrU(MM,2),2,"0")+":"+RSet(StrU(SS,2),2,"0")+":"+RSet(StrU(ms,2),3,"0")
  ;ProcedureReturn ti.s
EndProcedure

Procedure MediaGetVolume(Object.l) ; from -100db to 0db
  _GetMediaObject(*object) 
  Protected db.l
  *object\pAudio\get_Volume(@db)
  ProcedureReturn db/100 
EndProcedure

Procedure MediaPutVolume(Object.l, db.l) 
  _GetMediaObject(*object)
  If db > -85 And db < 1 
    Delay(10) : *object\pAudio\put_Volume(db*100)
  EndIf 
EndProcedure

Procedure MediaPutBalance(Object.l, bal.l)
  _GetMediaObject(*object)
  *object\pAudio\put_balance(bal*100)
EndProcedure

Procedure MediaGetBalance(Object.l)
  _GetMediaObject(*object)
  Protected bal
  *object\pAudio\get_balance(@bal)
  ProcedureReturn Int(bal/100)
EndProcedure

Procedure CloseMedia(Object.l)
  _GetMediaObject(*object)
  
  Protected pfs.l
  *object\pControl\GetState(10,@pfs)
  If Not pfs = #State_Stopped
    *object\pControl\stop()
  EndIf
  *object\pWindow\put_Visible(#OAFALSE)
  *object\pWindow\put_Owner(#OAFALSE)
  *object\pEvent\SetNotifyWindow(#Null, 0, 0)
  _DeleteInterfaces(Object)
  ClearList(filters())
  ProcedureReturn #True 
EndProcedure

Procedure FreeMedia(Object.l)
  If Object<>#PB_Any And Object_IsObject(g_DshowObjects, Object)
    _GetMediaObject(*object)
    Protected pfs.l
    If *object\pControl
      *object\pControl\GetState(10,@pfs)
      If Not pfs = #State_Stopped
        *object\pControl\stop()
      EndIf 
      CloseMedia(Object)
    EndIf
    CoUninitialize_()
    Object_FreeID(g_DshowObjects, Object)
    *object\Object = #False
    ProcedureReturn #True 
  EndIf
EndProcedure

Procedure InitMedia(Object.l)
  Protected *object.Dshow_Interfaces
  If Not g_DshowObjects
    g_DshowObjects = Object_Init(SizeOf(Dshow_Interfaces), 1, @FreeMedia())
  EndIf
  *object = Object_GetOrAllocateID(g_DshowObjects, Object)
  If *object
    *object\Object = #True
    CoInitializeEx_(0, $02); #COINIT_APARTMENTTHREADED
    ;CoInitialize_(0)
    ProcedureReturn #True
  Else
    ;Debug "Fatal Error: The given media no. hasn't been initialized!"
    ;CallDebugger
    ProcedureReturn #False
  EndIf 
EndProcedure


  CatchImage(0 , ?Mute3)
  CatchImage(1 , ?New2)
  CatchImage(2 , ?Nframe)
  CatchImage(3 , ?Pause2)
  CatchImage(4 , ?Play2)
  CatchImage(5 , ?Pframe)
  CatchImage(6 , ?Save)
  CatchImage(7 , ?Sound2)
  CatchImage(8 , ?Stop)
  CatchImage(9 , ?Max)
  CatchImage(10, ?Rest)
  
  ExtractIconEx_("shell32.dll",115,0,@hIcon,1)
  
  ExamineDesktops()

  hwnd = OpenWindow(0,0,0,800,520,"PB native Dshow example",#PB_Window_BorderLess|#WS_THICKFRAME|#WS_BORDER|#PB_Window_ScreenCentered)
  SendMessage_(WindowID(0),#WM_SETICON,0,hIcon)
  SetWindowColor(0,$7A7A7C)
  WindowBounds(0,800,520,#PB_Ignore,#PB_Ignore)
    
  ContainerGadget(0,5,447,790,68,#PB_Container_Flat)
  SetGadgetColor(0, #PB_Gadget_BackColor, $E3E3E3)
      TrackBarGadget     (1, 0, 0, 790, 30, 0, 10000,#TBS_AUTOTICKS)
      ButtonImageGadget  (2 ,2 ,28,32,32,ImageID(1))                ;Load
      GadgetToolTip(2,"New Media")
      ButtonImageGadget  (3 ,50,  32,24,24,ImageID(5))              ;Previous Frame
      GadgetToolTip(3,"Step Backward")
      SpinGadget         (4 ,75, 34,28,20,0,100,#PB_Spin_Numeric)   ;No. of Previos Frames
      GadgetToolTip(4,"No.of Frames to Step Backward")
      ButtonImageGadget  (5 ,112, 28,46,32,ImageID(4))               ;Play
      GadgetToolTip(5,"Play- Pause")
      SpinGadget         (6 ,165, 34,28,20,0,100,#PB_Spin_Numeric)  ;No. of Next Frames
      GadgetToolTip(6,"No.of Frames to Step Forward")
      ButtonImageGadget  (7,193, 32,24,24,ImageID(2))               ;Next Frame
      GadgetToolTip(7,"Step Forward")
      ButtonImageGadget  (8,530, 29,30,30,ImageID(6))               ;Save As
      GadgetToolTip(8,"Capture & Save Frame")
      TrackBarGadget     (9,300,24,70,16, 0, 25)                    ;Sound Volume
      GadgetToolTip(9,"Sound Volume")
      ButtonImageGadget  (10,230, 28,32,32,ImageID(7))              ;Sound Control
      GadgetToolTip(10,"Mute")
      ButtonImageGadget  (11,264, 28,32,32,ImageID(9))              ;Max - Min
      GadgetToolTip(11,"Maximize - Restore")
      ButtonImageGadget  (12,750, 29,32,32,ImageID(8))              ;Quit
      GadgetToolTip(12,"Quit")
      TrackBarGadget     (13,300,46,70,16,0, 20,#TBS_TOOLTIPS)      ;PlayBack Speed
      GadgetToolTip(13,"PlayBack Speed")
      
      ComboBoxGadget(14,376,22,140,20)
      GadgetToolTip(14,"Audio Mode")
      AddGadgetItem(14, -1, "WaveOutRenderer")
      AddGadgetItem(14, -1, "DirectSoundRenderer")
      
      ComboBoxGadget(15,376,43,120,20)
      GadgetToolTip(15,"Video Mode")
      AddGadgetItem(15, -1, "VMR9_Windowed")
      AddGadgetItem(15, -1, "VMR9_Windowless")
      AddGadgetItem(15, -1, "VMR7_Windowed")
      AddGadgetItem(15, -1, "VMR7_Windowless")
      AddGadgetItem(15, -1, "OldVideoRenderer")
      AddGadgetItem(15, -1, "OverlayMixer")
      AddGadgetItem(15, -1, "VMR7_ForceOverlays")
      AddGadgetItem(15, -1, "VMR7_ForceOffscreen")
      
      CheckBoxGadget(16,502,45,18,18,"",#PB_CheckBox_Center)
      GadgetToolTip(16,"Aspect Ratio")
      
      ComboBoxGadget(17,565,34,145,20)
      GadgetToolTip(17,"Save Image Format")
      AddGadgetItem(17, -1, "Use BMP ImageEncoder")
      AddGadgetItem(17, -1, "Use JPEG ImageEncoder")
      AddGadgetItem(17, -1, "Use PNG ImageEncoder")
  CloseGadgetList()
  
  TextGadget(18,10,10,120,22,"00:00:00:00",#SS_CENTERIMAGE | #SS_CENTER| #WS_BORDER)
  SetGadgetColor(18, #PB_Gadget_BackColor, $000000)
  SetGadgetColor(18, #PB_Gadget_FrontColor, $FFFFFF)

  SetGadgetState(4,1)
  SetGadgetState(6,1)
  SetGadgetState(9,25)
  SetGadgetState(13,10)
  
  SetGadgetState(14, 1)
  SetGadgetState(15, 2)
  
  SetGadgetState(16, 1)
  
  SetGadgetState(17, 2)
  
  SetGadgetItemData(14,0,1 << 6)
  SetGadgetItemData(14,1,1 << 7)
  
  SetGadgetItemData(15, 0, 1 << 0)
  SetGadgetItemData(15, 1, 1 << 1)
  SetGadgetItemData(15, 2, 1 << 2)
  SetGadgetItemData(15, 3, 1 << 3)
  SetGadgetItemData(15, 4, 1 << 4)
  SetGadgetItemData(15, 5, 1 << 5)
  SetGadgetItemData(15, 6, 1 << 6)
  SetGadgetItemData(15, 7, 1 << 8)
  SetGadgetItemData(15, 8, 1 << 9)
  SetGadgetItemData(15, 9, 1 << 10)
    
  SetActiveWindow(0)
  AddWindowTimer(0, 125, 10)  
      
Repeat

  Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
            Quit = 1
            
            
      Case #WM_ENTERSIZEMOVE
            HideGadget(0,1)
            
      Case #WM_EXITSIZEMOVE
            If Menu = 0
              HideGadget(0,0)
            EndIf
            
      Case #PB_Event_SizeWindow
           If Run = 1; And MediaState(#Media) = #State_Running
              ResizeMedia(Media, 5, 5, WindowWidth(0)-10, WindowHeight(0)-10,GetGadgetState(16))
              ResizeGadget(0,5, WindowHeight(0)-73, WindowWidth(0)-10,68)
              ResizeGadget(1,0, 0, GadgetWidth(0),24)
           Else
              ResizeGadget(0,5, WindowHeight(0)-73, WindowWidth(0)-10,68)
              ResizeGadget(1,0, 0, GadgetWidth(0),24)
           EndIf
       
      
      Case #PB_Event_Gadget
        Select EventGadget()
           Case 1  ;TrackBar
                  If Run = 1
                    If GetAsyncKeyState_(#VK_LBUTTON) > 0
                      SetGadgetAttribute(5,#PB_Button_Image,ImageID(4))              
                      PauseMedia(Media)  
                      MediaSeek(Media, (TTime.d/10000)*GetGadgetState(1))
                    ElseIf GetAsyncKeyState_(#VK_LBUTTON) = 0
                      SetGadgetAttribute(5,#PB_Button_Image,ImageID(3))
                      Play = 1
                      PlayMedia(Media)
                    EndIf
                  ElseIf Run = 0
                     SetGadgetState(1,0) 
                  EndIf                                                   
                  MediaTime2String((TTime.d/10000)*GetGadgetState(1))
                  SetGadgetText(18,ti$)
                  
           Case 2  ;Load
                  Mode = GetGadgetItemData(15, GetGadgetState(15))|GetGadgetItemData(14, GetGadgetState(14))
                  If Run = 1
                    MediaSeek(Media,0)
                    CloseMedia(Media)
                    FreeMedia(Media)
                    SetGadgetAttribute(5,#PB_Button_Image,ImageID(4))
                    SetGadgetState(1,0)
                    Run = 0 :Play = 0 :Mute = 0 :Menu = 0
                  EndIf                  
  
                  File.s = OpenFileRequester("Choose media file","","All Files (*.*)|*.*",0)
                  If File <> ""
                      Cap$ = Left(GetFilePart(File), Len(GetFilePart(File))-Len(GetExtensionPart(File))-1)
      
                      InitMedia(Media)
                      
                      If IsLibrary(0)
                          *func=GetFunction(0,"DwmEnableComposition")
                          CallFunctionFast(*func,1) 
                          CloseLibrary(0)
                      EndIf
                                            
                      If OSVersion() >= #PB_OS_Windows_Vista And Mode & #OverlayMixer
                         Mode = Mode|#VMR7_Windowed &~ #OverlayMixer
                         OpenLibrary(0, "dwmapi.dll")
                         *func=GetFunction(0,"DwmEnableComposition")
                         CallFunctionFast(*func,0)
                      EndIf                      
               
                      LoadMedia(Media, File, hwnd ,Mode)
                      BringWindowToTop_(GadgetID(0))
                      TTime.d = MediaLenght(Media, #MEDIA_TIME_MSECS)
                      Frames  = MediaLenght(Media, #MEDIA_TIME_FRAMES)
                      fps     = MediaFPS(Media)                            ;Frames*1000/TTime
                      If Frames <> 0 And fps <> 0
                          mWidth = MediaWidth(Media) : mHeight = MediaHeight(Media)
                          ResizeMedia(Media, 5,5, WindowWidth(0)-10, WindowHeight(0)-10,#True)
                          Run = 1
                      Else
                        MessageRequester("Error","Can not load the movie !"+#CRLF$+"Check the Codecs",#MB_ICONERROR)
                          Run = 0
                      EndIf
                  EndIf
           
           Case 3   ;Pframe
                  If Run = 1
                  PauseMedia(Media)
                  For i = 1 To GetGadgetState(4)
                    MediaSeek(Media, MediaPosition(Media,#MEDIA_TIME_MSECS)-fps)
                    If MediaPosition(Media,#MEDIA_TIME_FRAMES) = OldPos
                      MediaSeek(Media, MediaPosition(Media,#MEDIA_TIME_MSECS)-fps)
                    EndIf
                  OldPos = MediaPosition(Media,#MEDIA_TIME_MSECS)
                  Next
                  Play = 0
                  SetGadgetAttribute(5,#PB_Button_Image,ImageID(4)) 
                  EndIf
           
           Case 5    ;Play\Pause
                ;HideGadget(0,1)
                ;Menu = 1 
                If Run = 1
                PutRate(Media,GetGadgetState(13)/10)
                Play ! 1
                If Play = 1
                  SetGadgetAttribute(5,#PB_Button_Image,ImageID(3))
                  PlayMedia(Media)
                Else
                  SetGadgetAttribute(5,#PB_Button_Image,ImageID(4))
                  PauseMedia(Media)
                EndIf
                EndIf
            
           
           Case 7    ;Nframe
             If Run =1
                PauseMedia(Media)
                For i = 1 To GetGadgetState(6)
                MediaSeek(Media, MediaPosition(Media,#MEDIA_TIME_MSECS)+fps)
                If MediaPosition(Media,#MEDIA_TIME_FRAMES) = OldPos
                  MediaSeek(Media, MediaPosition(Media,#MEDIA_TIME_MSECS)+fps)
                EndIf
                OldPos = MediaPosition(Media,#MEDIA_TIME_MSECS)
                Next
                Play = 0
                SetGadgetAttribute(5,#PB_Button_Image,ImageID(4)) 
                EndIf
               
           Case 8    ;Save As                
                HideGadget(0,1)
                UpdateWindow_(WindowID(0))
                hBitmap = CreateImage(0,WindowWidth(0)-10,WindowHeight(0)-10)
                hdc = StartDrawing(ImageOutput(0))
                SelectObject_(hdc, hBitmap)
                BitBlt_(hdc, 0,0, WindowWidth(0)-10,WindowHeight(0)-10, GetDC_(GetDesktopWindow_()), WindowX(0)+10,WindowY(0)+10, #SRCCOPY | #CAPTUREBLT)
                StopDrawing()
                DeleteDC_(hdc)                
                If Run = 1
                  If GetGadgetState(17) = 0
                     SaveImage(0, GetHomeDirectory()+Cap$+" "+Right(Str(im),2)+".bmp",#PB_ImagePlugin_BMP)
                  ElseIf GetGadgetState(17) = 1
                     SaveImage(0, GetHomeDirectory()+Cap$+" "+Right(Str(im),2)+".jpg",#PB_ImagePlugin_JPEG)
                  Else
                     SaveImage(0, GetHomeDirectory()+Cap$+" "+Right(Str(im),2)+".png",#PB_ImagePlugin_PNG)
                  EndIf
                  im+1
                EndIf
                HideGadget(0,0)
                
           Case 9
                If Run =1
                    MediaPutVolume(Media, GetGadgetState(9) - 25)
                EndIf
                
           Case 10   ;Sound \ Mute
                If Run = 1
                Mute ! 1 
                If Mute = 1
                    SetGadgetAttribute(10,#PB_Button_Image,ImageID(0))
                    MediaPutVolume(Media, MediaGetVolume(Media)-80)
                Else
                    SetGadgetAttribute(10,#PB_Button_Image,ImageID(7))
                    MediaPutVolume(Media, MediaGetVolume(Media)+80)               
                EndIf
                EndIf 
           
           Case 11   ;Max \ Restore
                If Run =1
                Max ! 1 
                  If Max = 1
                      SetGadgetAttribute(11,#PB_Button_Image,ImageID(10))
                      ShowWindow_(WindowID(0),#SW_MAXIMIZE)
                  Else
                      SetGadgetAttribute(11,#PB_Button_Image,ImageID(9))
                      ShowWindow_(WindowID(0),#SW_RESTORE	)                  
                  EndIf
                EndIf
           
           Case 12    ;Quit
                If IsLibrary(0) 
                    CloseLibrary(0)
                EndIf
                If Run = 1
                    CloseMedia(Media)
                    FreeMedia(Media)
                EndIf
                Quit = 1
                
                
           Case 13
                If Run = 1
                   PutRate(Media,GetGadgetState(13)/10)
                EndIf
                
           Case 16
                  ResizeMedia(Media, 5, 5, WindowWidth(0)-10, WindowHeight(0)-10,GetGadgetState(16))           
           
        EndSelect
          
                
          Case  #PB_Event_MoveWindow
                UpdateWindow_(WindowID(0))

              
          Case #PB_Event_Timer
                If Run = 1 And MediaState(Media) = #State_Running
                    Npos.f = MediaPosition(Media,#MEDIA_TIME_MSECS)
                    SetGadgetState(1, Int(Npos.f * 10000 / TTime ) )
                    MediaTime2String(Npos.f)
                    SetGadgetText(18,ti$)
                EndIf
         
;     
          Case #WM_LBUTTONDOWN
                GetCursorPos_ (@p.POINT) 
                ScreenToClient_ (WindowID(0), @p)     
                If ChildWindowFromPoint_ (WindowID(0), p\y<< 32+p\x) = GadgetID(0)
                   SetCursor_(LoadCursor_(0, #IDC_ARROW))
                Else
                    SetCursor_(LoadCursor_(0, #IDC_SIZEALL))
                    SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
                EndIf
    
;     
          Case #WM_RBUTTONDOWN
                If Run = 1
                  Menu ! 1
                  If Menu = 1
                      HideGadget(0,1)
                  Else
                      HideGadget(0,0)
                  EndIf
                EndIf     

EndSelect
;         
      
Until Quit = 1

If IsLibrary(0) 
    CloseLibrary(0)
EndIf
Edit :Update fixing more bugs
Last edited by RASHAD on Fri Mar 29, 2013 3:20 am, edited 1 time in total.
Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Media Player [Windows]

Post by Kwai chang caine »

Nice job RASHAD :shock:
Works fine on W7, but when i clic on floppy button nothing happen :cry:
ImageThe happiness is a road...
Not a destination
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4637
Joined: Sun Apr 12, 2009 6:27 am

Re: Media Player [Windows]

Post by RASHAD »

Hi KCK :mrgreen:
Thanks
Click on floppy to do what ?
Egypt my love
SFSxOI
Addict
Addict
Posts: 2970
Joined: Sat Dec 31, 2005 5:24 pm
Location: Where ya would never look.....

Re: Media Player [Windows]

Post by SFSxOI »

Rashad,

In the second code you posted if you right click on the empty area above the controls (no video loaded) the controls vanish. If you right click again the controls reappear. Feature or bug? :)

Have not had time to go thru it to see where this may be happening.
The advantage of a 64 bit operating system over a 32 bit operating system comes down to only being twice the headache.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4637
Joined: Sun Apr 12, 2009 6:27 am

Re: Media Player [Windows]

Post by RASHAD »

Hi SFSxOI :)
Right Button to control the visibility of the control Panel
But still you are absolutely right
Change to :

Code: Select all

      Case #WM_ENTERSIZEMOVE
            HideGadget(0,1)
            HideGadget(1,1)
            Menu = 1
            
      Case #WM_EXITSIZEMOVE
            HideGadget(0,0)
            HideGadget(1,0)
            Menu = 0
And

Code: Select all

          Case #WM_RBUTTONDOWN
               If Run = 1
                  Menu ! 1
                  If Menu = 1
                      HideGadget(0,1)
                  Else
                      HideGadget(0,0)
                  EndIf
                EndIf  
Egypt my love
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4637
Joined: Sun Apr 12, 2009 6:27 am

Re: Media Player [Windows]

Post by RASHAD »

Second post for part #1 just updated
Egypt my love
dige
Addict
Addict
Posts: 1247
Joined: Wed Apr 30, 2003 8:15 am
Location: Germany
Contact:

Re: Media Player [Windows]

Post by dige »

@RASHAD: I use win7/x64 and the K-Lite Codecpack. When I play movies and load a new one, in the systray remains an icon and the file remains still open. For example, you can not delete the file, until the program is finished. Can you reproduce it?
Seems that CloseMedia(Media) or FreeMedia(Media) does not release the movie completely..

Thanks for your help, kind regards, dige
"Daddy, I'll run faster, then it is not so far..."
Post Reply