Files
Client/Library/dxx8/samples/Multimedia/VBSamples/DirectMusic/PlayMotif/frmPlayMotif.frm
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

472 lines
15 KiB
Plaintext

VERSION 5.00
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx"
Begin VB.Form frmPlayMotif
BorderStyle = 3 'Fixed Dialog
Caption = "vb PlayMotif"
ClientHeight = 4365
ClientLeft = 45
ClientTop = 330
ClientWidth = 5955
Icon = "frmPlayMotif.frx":0000
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 4365
ScaleWidth = 5955
StartUpPosition = 3 'Windows Default
Begin MSComDlg.CommonDialog cdlOpen
Left = 5160
Top = 1080
_ExtentX = 847
_ExtentY = 847
_Version = 393216
DialogTitle = "Open Segment File"
End
Begin VB.TextBox txtStatus
BackColor = &H8000000F&
Height = 315
Left = 1320
Locked = -1 'True
TabIndex = 16
Top = 600
Width = 4515
End
Begin VB.TextBox txtSegment
BackColor = &H8000000F&
Height = 315
Left = 1320
Locked = -1 'True
TabIndex = 14
Top = 180
Width = 4515
End
Begin VB.OptionButton optMeasure
Caption = "Measure"
Height = 255
Left = 4800
TabIndex = 13
Top = 3600
Value = -1 'True
Width = 975
End
Begin VB.OptionButton optBeat
Caption = "Beat"
Height = 255
Left = 4020
TabIndex = 12
Top = 3600
Width = 675
End
Begin VB.OptionButton optGrid
Caption = "Grid"
Height = 255
Left = 3180
TabIndex = 11
Top = 3600
Width = 735
End
Begin VB.OptionButton optImmediate
Caption = "Immediate"
Height = 255
Left = 2040
TabIndex = 10
Top = 3600
Width = 1035
End
Begin VB.OptionButton optDefault
Caption = "Default"
Height = 255
Left = 1080
TabIndex = 9
Top = 3600
Width = 855
End
Begin VB.ListBox lstMotif
Height = 1815
Left = 60
TabIndex = 7
Top = 1680
Width = 5775
End
Begin VB.CheckBox chkLoop
Caption = "Loop Segment"
Height = 195
Left = 120
TabIndex = 5
Top = 1140
Width = 1395
End
Begin VB.CommandButton cmdStop
Caption = "&Stop"
Height = 315
Left = 2700
TabIndex = 4
Top = 1080
Width = 1095
End
Begin VB.CommandButton cmdPlay
Caption = "&Play"
Height = 315
Left = 1560
TabIndex = 3
Top = 1080
Width = 1095
End
Begin VB.CommandButton cmdExit
Caption = "E&xit"
Height = 315
Left = 4740
TabIndex = 2
Top = 3960
Width = 1095
End
Begin VB.CommandButton cmdPlayMotif
Caption = "Play &Motif"
Height = 315
Left = 60
TabIndex = 1
Top = 3960
Width = 1095
End
Begin VB.CommandButton cmdSegment
Caption = "Segment &File"
Default = -1 'True
Height = 315
Left = 120
TabIndex = 0
Top = 180
Width = 1095
End
Begin VB.Label Label1
Alignment = 1 'Right Justify
BackStyle = 0 'Transparent
Caption = "Status:"
Height = 195
Index = 2
Left = 120
TabIndex = 15
Top = 660
Width = 1035
End
Begin VB.Label Label1
BackStyle = 0 'Transparent
Caption = "Align Option:"
Height = 195
Index = 1
Left = 60
TabIndex = 8
Top = 3600
Width = 915
End
Begin VB.Label Label1
BackStyle = 0 'Transparent
Caption = "Select a Motif:"
Height = 195
Index = 0
Left = 60
TabIndex = 6
Top = 1440
Width = 4635
End
End
Attribute VB_Name = "frmPlayMotif"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
'
' File: frmPlayMotif.frm
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Implements DirectXEvent8
Private Type Motif_Node
Motif As DirectMusicSegment8
Name As String
ListIndex As Long
End Type
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private dx As New DirectX8
Private dmPerf As DirectMusicPerformance8
Private dmLoader As DirectMusicLoader8
Private dmSegment As DirectMusicSegment8
Private mlSeg As Long
Private moMotifs() As Motif_Node
Private Sub cmdExit_Click()
Unload Me
End Sub
Private Sub cmdPlay_Click()
If chkLoop.Value = vbChecked Then
dmSegment.SetRepeats INFINITE
Else
dmSegment.SetRepeats 0
End If
dmPerf.PlaySegmentEx dmSegment, 0, 0
EnablePlayUI False
End Sub
Private Sub cmdPlayMotif_Click()
Dim lFlags As CONST_DMUS_SEGF_FLAGS
lFlags = DMUS_SEGF_SECONDARY
If optBeat.Value Then lFlags = lFlags Or DMUS_SEGF_BEAT
If optDefault.Value Then lFlags = lFlags Or DMUS_SEGF_DEFAULT
If optGrid.Value Then lFlags = lFlags Or DMUS_SEGF_GRID
If optImmediate.Value Then lFlags = lFlags Or DMUS_SEGF_SECONDARY
If optMeasure.Value Then lFlags = lFlags Or DMUS_SEGF_MEASURE
dmPerf.PlaySegmentEx moMotifs(lstMotif.ListIndex).Motif, lFlags, 0
End Sub
Private Sub cmdSegment_Click()
Static sCurDir As String
Static lFilter As Long
'We want to open a file now
cdlOpen.flags = cdlOFNHideReadOnly Or cdlOFNFileMustExist
cdlOpen.FilterIndex = lFilter
cdlOpen.Filter = "Segment Files (*.sgt)|*.sgt"
cdlOpen.FileName = vbNullString
If sCurDir = vbNullString Then
'Set the init folder to \windows\media if it exists. If not, set it to the \windows folder
Dim sWindir As String
sWindir = Space$(255)
If GetWindowsDirectory(sWindir, 255) = 0 Then
'We couldn't get the windows folder for some reason, use the c:\
cdlOpen.InitDir = "C:\"
Else
Dim sMedia As String
sWindir = Left$(sWindir, InStr(sWindir, Chr$(0)) - 1)
If Right$(sWindir, 1) = "\" Then
sMedia = sWindir & "Media"
Else
sMedia = sWindir & "\Media"
End If
If Dir$(sMedia, vbDirectory) <> vbNullString Then
cdlOpen.InitDir = sMedia
Else
cdlOpen.InitDir = sWindir
End If
End If
Else
cdlOpen.InitDir = sCurDir
End If
On Local Error GoTo ClickedCancel
cdlOpen.CancelError = True
cdlOpen.ShowOpen ' Display the Open dialog box
'Save the current information
sCurDir = GetFolder(cdlOpen.FileName)
'Set the search folder to this one so we can auto download anything we need
dmLoader.SetSearchDirectory sCurDir
lFilter = cdlOpen.FilterIndex
On Local Error GoTo NoLoadSegment
'Before we load the segment stop one if it's playing
cmdStop_Click
'Now let's load the segment
LoadSegment cdlOpen.FileName
Exit Sub
NoLoadSegment:
UpdateStatus "Couldn't load this segment"
ClickedCancel:
End Sub
Private Sub cmdStop_Click()
'Stop the segment
dmPerf.StopEx dmSegment, 0, 0
EnablePlayUI True
UpdateStatus "User pressed stop."
End Sub
Private Sub DirectXEvent8_DXCallback(ByVal eventid As Long)
'Here we will handle the DMusic callbacks
Dim dmNotification As DMUS_NOTIFICATION_PMSG
Dim oState As DirectMusicSegmentState8
Dim oSeg As DirectMusicSegment8
Dim lCount As Long
On Error GoTo FailedOut
'Process all events
Do While dmPerf.GetNotificationPMSG(dmNotification)
If dmNotification.lNotificationOption = DMUS_NOTIFICATION_SEGEND Then 'The segment has ended
'First we need to figure out which segment
Set oState = dmNotification.User 'The user field holds the segment state on segment notifications
Set oSeg = oState.GetSegment 'Get the segment from the state
'Is this the primary segment?
If oSeg Is dmSegment Then 'Yup
UpdateStatus "Primary Segment stopped playing."
EnablePlayUI True
Else
'Go through all of the other segments
For lCount = 0 To UBound(moMotifs)
If oSeg Is moMotifs(lCount).Motif Then
UpdateStatus moMotifs(lCount).Name & " motif stopped playing."
'Now update the listbox
lstMotif.List(moMotifs(lCount).ListIndex) = moMotifs(lCount).Name
End If
Next
End If
End If
If dmNotification.lNotificationOption = DMUS_NOTIFICATION_SEGSTART Then 'The segment has started
'First we need to figure out which segment
Set oState = dmNotification.User 'The user field holds the segment state on segment notifications
Set oSeg = oState.GetSegment 'Get the segment from the state
'Is this the primary segment?
If oSeg Is dmSegment Then 'Yup
UpdateStatus "Primary Segment started playing."
Else
'Go through all of the other segments
For lCount = 0 To UBound(moMotifs)
If oSeg Is moMotifs(lCount).Motif Then
UpdateStatus moMotifs(lCount).Name & " motif started playing."
'Now update the listbox
lstMotif.List(moMotifs(lCount).ListIndex) = moMotifs(lCount).Name & " (Playing)"
End If
Next
End If
End If
Loop
Exit Sub
FailedOut:
MsgBox "Error processing this Notification", vbOKOnly Or vbInformation, "Cannot Process."
End Sub
Private Sub Form_Load()
Me.Show
InitAudio
End Sub
Private Sub InitAudio()
On Error GoTo FailedInit
Dim dma As DMUS_AUDIOPARAMS
Dim sMedia As String
'Create our objects
Set dmPerf = dx.DirectMusicPerformanceCreate
Set dmLoader = dx.DirectMusicLoaderCreate
'Set up a default audio path
dmPerf.InitAudio Me.hWnd, DMUS_AUDIOF_ALL, dma, , DMUS_APATH_SHARED_STEREOPLUSREVERB, 128
'Create an event handle
mlSeg = dx.CreateEvent(Me)
dmPerf.AddNotificationType DMUS_NOTIFY_ON_SEGMENT
dmPerf.SetNotificationHandle mlSeg
'Don't let them play a motif yet
cmdPlayMotif.Enabled = False
'Now let's load our default segment
sMedia = FindMediaDir("sample.sgt")
dmLoader.SetSearchDirectory sMedia
If sMedia = vbNullString Then sMedia = AddDirSep(CurDir)
LoadSegment sMedia & "sample.sgt"
EnablePlayMotif False
Exit Sub
FailedInit:
MsgBox "Could not initialize DirectMusic." & vbCrLf & "This sample will exit.", vbOKOnly Or vbInformation, "Exiting..."
Unload Me
End Sub
Private Sub Cleanup()
On Error Resume Next
'Get rid of our event
dmPerf.RemoveNotificationType DMUS_NOTIFY_ON_SEGMENT
dx.DestroyEvent mlSeg
'Unload our segment
If Not (dmSegment Is Nothing) Then dmSegment.Unload dmPerf.GetDefaultAudioPath
Set dmSegment = Nothing
'Get rid of our motifs
ReDim moMotifs(0)
'Cleanup
dmPerf.CloseDown
Set dmPerf = Nothing
Set dmLoader = Nothing
End Sub
Private Sub Form_Unload(Cancel As Integer)
Cleanup
End Sub
Private Function GetFolder(ByVal sFile As String) As String
Dim lCount As Long
For lCount = Len(sFile) To 1 Step -1
If Mid$(sFile, lCount, 1) = "\" Then
GetFolder = Left$(sFile, lCount)
Exit Function
End If
Next
GetFolder = vbNullString
End Function
Public Sub EnablePlayUI(fEnable As Boolean)
'Enable/Disable the buttons
If fEnable Then
chkLoop.Enabled = True
cmdStop.Enabled = False
cmdPlay.Enabled = True
cmdSegment.Enabled = True
cmdPlay.SetFocus
Else
chkLoop.Enabled = False
cmdStop.Enabled = True
cmdPlay.Enabled = False
cmdSegment.Enabled = False
cmdStop.SetFocus
End If
If lstMotif.ListCount > 0 And lstMotif.ListIndex <> -1 Then
EnablePlayMotif Not fEnable
Else
EnablePlayMotif False
End If
End Sub
Public Sub EnablePlayMotif(ByVal fEnable As Boolean)
cmdPlayMotif.Enabled = fEnable
End Sub
Private Sub LoadSegment(ByVal sFile As String)
Dim lTrack As Long, lCount As Long
Dim oStyle As DirectMusicStyle8
Dim lTotalStyle As Long, lTempTotalStyle As Long
On Error GoTo LeaveProc
ReDim moMotifs(0)
lstMotif.Clear
Set dmSegment = dmLoader.LoadSegment(sFile)
dmSegment.Download dmPerf.GetDefaultAudioPath
txtSegment.Text = sFile
EnablePlayUI True
'Now let's get the motifs in this segment
Do While True
Set oStyle = dmSegment.GetStyle(lTrack)
lTotalStyle = lTotalStyle + oStyle.GetMotifCount - 1
ReDim Preserve moMotifs(lTotalStyle)
For lCount = 0 To oStyle.GetMotifCount - 1
lstMotif.AddItem oStyle.GetMotifName(lCount)
Set moMotifs(lTempTotalStyle + lCount).Motif = oStyle.GetMotif(oStyle.GetMotifName(lCount))
moMotifs(lTempTotalStyle + lCount).Name = oStyle.GetMotifName(lCount)
moMotifs(lTempTotalStyle + lCount).ListIndex = lstMotif.ListCount - 1
Next
lTrack = lTrack + 1
lTempTotalStyle = lTotalStyle
Loop
LeaveProc:
If lstMotif.ListCount > 0 Then lstMotif.ListIndex = 0
UpdateStatus "File loaded."
End Sub
Private Sub UpdateStatus(sStat As String)
txtStatus.Text = sStat
End Sub