ホーム › Media.Audio.DirectMusic › MIDIOPENDESC
MIDIOPENDESC
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| hMidi | HMIDI | 8/4 | +0 | +0 | MIDIデバイスのハンドル。 |
| dwCallback | UINT_PTR | 8/4 | +8 | +4 | 再生/録音通知用のコールバックアドレス(関数/ウィンドウ/イベント)。 |
| dwInstance | UINT_PTR | 8/4 | +16 | +8 | コールバックに渡すユーザーインスタンスデータ。 |
| dnDevNode | UINT_PTR | 8/4 | +24 | +12 | デバイスのデバイスノード(devnode)識別子。 |
| cIds | DWORD | 4 | +32 | +16 | rgIds配列に含まれるストリームID数。 |
| rgIds | MIDIOPENSTRMID | 8 | +36 | +20 | ストリームID情報(MIDIOPENSTRMID)の可変長配列先頭。 |
各言語での定義
#include <windows.h>
// MIDIOPENSTRMID (x64 8 / x86 8 バイト)
#pragma pack(push, 1)
typedef struct MIDIOPENSTRMID {
DWORD dwStreamID;
DWORD uDeviceID;
} MIDIOPENSTRMID;
#pragma pack(pop)
// MIDIOPENDESC (x64 44 / x86 28 バイト)
#pragma pack(push, 1)
typedef struct MIDIOPENDESC {
HMIDI hMidi;
UINT_PTR dwCallback;
UINT_PTR dwInstance;
UINT_PTR dnDevNode;
DWORD cIds;
MIDIOPENSTRMID rgIds[1];
} MIDIOPENDESC;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct MIDIOPENSTRMID
{
public uint dwStreamID;
public uint uDeviceID;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct MIDIOPENDESC
{
public IntPtr hMidi;
public UIntPtr dwCallback;
public UIntPtr dwInstance;
public UIntPtr dnDevNode;
public uint cIds;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)] public MIDIOPENSTRMID[] rgIds;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure MIDIOPENSTRMID
Public dwStreamID As UInteger
Public uDeviceID As UInteger
End Structure
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure MIDIOPENDESC
Public hMidi As IntPtr
Public dwCallback As UIntPtr
Public dwInstance As UIntPtr
Public dnDevNode As UIntPtr
Public cIds As UInteger
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=1)> Public rgIds() As MIDIOPENSTRMID
End Structureimport ctypes
from ctypes import wintypes
class MIDIOPENSTRMID(ctypes.Structure):
_pack_ = 1
_fields_ = [
("dwStreamID", wintypes.DWORD),
("uDeviceID", wintypes.DWORD),
]
class MIDIOPENDESC(ctypes.Structure):
_pack_ = 1
_fields_ = [
("hMidi", ctypes.c_void_p),
("dwCallback", ctypes.c_size_t),
("dwInstance", ctypes.c_size_t),
("dnDevNode", ctypes.c_size_t),
("cIds", wintypes.DWORD),
("rgIds", MIDIOPENSTRMID * 1),
]#[repr(C, packed(1))]
pub struct MIDIOPENSTRMID {
pub dwStreamID: u32,
pub uDeviceID: u32,
}
#[repr(C, packed(1))]
pub struct MIDIOPENDESC {
pub hMidi: *mut core::ffi::c_void,
pub dwCallback: usize,
pub dwInstance: usize,
pub dnDevNode: usize,
pub cIds: u32,
pub rgIds: [MIDIOPENSTRMID; 1],
}import "golang.org/x/sys/windows"
type MIDIOPENSTRMID struct {
dwStreamID uint32
uDeviceID uint32
}
type MIDIOPENDESC struct {
hMidi uintptr
dwCallback uintptr
dwInstance uintptr
dnDevNode uintptr
cIds uint32
rgIds [1]MIDIOPENSTRMID
}type
MIDIOPENSTRMID = packed record
dwStreamID: DWORD;
uDeviceID: DWORD;
end;
MIDIOPENDESC = packed record
hMidi: Pointer;
dwCallback: NativeUInt;
dwInstance: NativeUInt;
dnDevNode: NativeUInt;
cIds: DWORD;
rgIds: array[0..0] of MIDIOPENSTRMID;
end;const MIDIOPENSTRMID = extern struct {
dwStreamID: u32,
uDeviceID: u32,
};
const MIDIOPENDESC = extern struct {
hMidi: ?*anyopaque,
dwCallback: usize,
dwInstance: usize,
dnDevNode: usize,
cIds: u32,
rgIds: [1]MIDIOPENSTRMID,
};type
MIDIOPENSTRMID {.packed.} = object
dwStreamID: uint32
uDeviceID: uint32
MIDIOPENDESC {.packed.} = object
hMidi: pointer
dwCallback: uint
dwInstance: uint
dnDevNode: uint
cIds: uint32
rgIds: array[1, MIDIOPENSTRMID]align(1)
struct MIDIOPENSTRMID
{
uint dwStreamID;
uint uDeviceID;
}
align(1)
struct MIDIOPENDESC
{
void* hMidi;
size_t dwCallback;
size_t dwInstance;
size_t dnDevNode;
uint cIds;
MIDIOPENSTRMID[1] rgIds;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; MIDIOPENDESC サイズ: 28 バイト(x86)
dim st, 7 ; 4byte整数×7(構造体サイズ 28 / 4 切り上げ)
; hMidi : HMIDI (+0, 4byte) st.0 = 値 / 値 = st.0 (lpoke/lpeek も可)
; dwCallback : UINT_PTR (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; dwInstance : UINT_PTR (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; dnDevNode : UINT_PTR (+12, 4byte) st.3 = 値 / 値 = st.3 (lpoke/lpeek も可)
; cIds : DWORD (+16, 4byte) st.4 = 値 / 値 = st.4 (lpoke/lpeek も可)
; rgIds : MIDIOPENSTRMID (+20, 8byte) varptr(st)+20 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; MIDIOPENDESC サイズ: 44 バイト(x64)
dim st, 11 ; 4byte整数×11(構造体サイズ 44 / 4 切り上げ)
; hMidi : HMIDI (+0, 8byte) qpoke st,0,値 / qpeek(st,0) ※IronHSPのみ。3.7/3.8は lpoke st,0,下位 : lpoke st,4,上位
; dwCallback : UINT_PTR (+8, 8byte) qpoke st,8,値 / qpeek(st,8) ※IronHSPのみ。3.7/3.8は lpoke st,8,下位 : lpoke st,12,上位
; dwInstance : UINT_PTR (+16, 8byte) qpoke st,16,値 / qpeek(st,16) ※IronHSPのみ。3.7/3.8は lpoke st,16,下位 : lpoke st,20,上位
; dnDevNode : UINT_PTR (+24, 8byte) qpoke st,24,値 / qpeek(st,24) ※IronHSPのみ。3.7/3.8は lpoke st,24,下位 : lpoke st,28,上位
; cIds : DWORD (+32, 4byte) st.8 = 値 / 値 = st.8 (lpoke/lpeek も可)
; rgIds : MIDIOPENSTRMID (+36, 8byte) varptr(st)+36 を基点に操作(8byte:入れ子/配列)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global MIDIOPENSTRMID, pack=1
#field int dwStreamID
#field int uDeviceID
#endstruct
#defstruct global MIDIOPENDESC, pack=1
#field intptr hMidi
#field intptr dwCallback
#field intptr dwInstance
#field intptr dnDevNode
#field int cIds
#field MIDIOPENSTRMID rgIds 1
#endstruct
stdim st, MIDIOPENDESC ; NSTRUCT 変数を確保
st->dwCallback = 100
mes "dwCallback=" + st->dwCallback