Win32 API 日本語リファレンス
ホームMedia.Speech › SPVTEXTFRAG

SPVTEXTFRAG

構造体
サイズx64: 96 バイト / x86: 68 バイト

サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。

フィールド

フィールドサイズx64x86説明
pNextSPVTEXTFRAG*8/4+0+0次のテキストフラグメントへのポインタ。末尾ならNULL。
StateSPVSTATE72/52+8+4このフラグメントに適用される合成状態(SPVSTATE)。
pTextStartLPWSTR8/4+80+56フラグメントのテキスト開始位置へのポインタ。
ulTextLenDWORD4+88+60フラグメントのテキスト文字数。
ulTextSrcOffsetDWORD4+92+64元テキスト先頭からのこのフラグメントの文字オフセット。

各言語での定義

#include <windows.h>

// SPVPITCH  (x64 8 / x86 8 バイト)
typedef struct SPVPITCH {
    INT MiddleAdj;
    INT RangeAdj;
} SPVPITCH;

// SPVCONTEXT  (x64 24 / x86 12 バイト)
typedef struct SPVCONTEXT {
    LPWSTR pCategory;
    LPWSTR pBefore;
    LPWSTR pAfter;
} SPVCONTEXT;

// SPVSTATE  (x64 72 / x86 52 バイト)
typedef struct SPVSTATE {
    SPVACTIONS eAction;
    WORD LangID;
    WORD wReserved;
    INT EmphAdj;
    INT RateAdj;
    DWORD Volume;
    SPVPITCH PitchAdj;
    DWORD SilenceMSecs;
    WORD* pPhoneIds;
    SPPARTOFSPEECH ePartOfSpeech;
    SPVCONTEXT Context;
} SPVSTATE;

// SPVTEXTFRAG  (x64 96 / x86 68 バイト)
typedef struct SPVTEXTFRAG {
    SPVTEXTFRAG* pNext;
    SPVSTATE State;
    LPWSTR pTextStart;
    DWORD ulTextLen;
    DWORD ulTextSrcOffset;
} SPVTEXTFRAG;
using System;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPVPITCH
{
    public int MiddleAdj;
    public int RangeAdj;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPVCONTEXT
{
    public IntPtr pCategory;
    public IntPtr pBefore;
    public IntPtr pAfter;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPVSTATE
{
    public int eAction;
    public ushort LangID;
    public ushort wReserved;
    public int EmphAdj;
    public int RateAdj;
    public uint Volume;
    public SPVPITCH PitchAdj;
    public uint SilenceMSecs;
    public IntPtr pPhoneIds;
    public int ePartOfSpeech;
    public SPVCONTEXT Context;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SPVTEXTFRAG
{
    public IntPtr pNext;
    public SPVSTATE State;
    public IntPtr pTextStart;
    public uint ulTextLen;
    public uint ulTextSrcOffset;
}
Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPVPITCH
    Public MiddleAdj As Integer
    Public RangeAdj As Integer
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPVCONTEXT
    Public pCategory As IntPtr
    Public pBefore As IntPtr
    Public pAfter As IntPtr
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPVSTATE
    Public eAction As Integer
    Public LangID As UShort
    Public wReserved As UShort
    Public EmphAdj As Integer
    Public RateAdj As Integer
    Public Volume As UInteger
    Public PitchAdj As SPVPITCH
    Public SilenceMSecs As UInteger
    Public pPhoneIds As IntPtr
    Public ePartOfSpeech As Integer
    Public Context As SPVCONTEXT
End Structure

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
Public Structure SPVTEXTFRAG
    Public pNext As IntPtr
    Public State As SPVSTATE
    Public pTextStart As IntPtr
    Public ulTextLen As UInteger
    Public ulTextSrcOffset As UInteger
End Structure
import ctypes
from ctypes import wintypes

class SPVPITCH(ctypes.Structure):
    _fields_ = [
        ("MiddleAdj", ctypes.c_int),
        ("RangeAdj", ctypes.c_int),
    ]

class SPVCONTEXT(ctypes.Structure):
    _fields_ = [
        ("pCategory", ctypes.c_void_p),
        ("pBefore", ctypes.c_void_p),
        ("pAfter", ctypes.c_void_p),
    ]

class SPVSTATE(ctypes.Structure):
    _fields_ = [
        ("eAction", ctypes.c_int),
        ("LangID", ctypes.c_ushort),
        ("wReserved", ctypes.c_ushort),
        ("EmphAdj", ctypes.c_int),
        ("RateAdj", ctypes.c_int),
        ("Volume", wintypes.DWORD),
        ("PitchAdj", SPVPITCH),
        ("SilenceMSecs", wintypes.DWORD),
        ("pPhoneIds", ctypes.c_void_p),
        ("ePartOfSpeech", ctypes.c_int),
        ("Context", SPVCONTEXT),
    ]

class SPVTEXTFRAG(ctypes.Structure):
    _fields_ = [
        ("pNext", ctypes.c_void_p),
        ("State", SPVSTATE),
        ("pTextStart", ctypes.c_void_p),
        ("ulTextLen", wintypes.DWORD),
        ("ulTextSrcOffset", wintypes.DWORD),
    ]
#[repr(C)]
pub struct SPVPITCH {
    pub MiddleAdj: i32,
    pub RangeAdj: i32,
}

#[repr(C)]
pub struct SPVCONTEXT {
    pub pCategory: *mut core::ffi::c_void,
    pub pBefore: *mut core::ffi::c_void,
    pub pAfter: *mut core::ffi::c_void,
}

#[repr(C)]
pub struct SPVSTATE {
    pub eAction: i32,
    pub LangID: u16,
    pub wReserved: u16,
    pub EmphAdj: i32,
    pub RateAdj: i32,
    pub Volume: u32,
    pub PitchAdj: SPVPITCH,
    pub SilenceMSecs: u32,
    pub pPhoneIds: *mut core::ffi::c_void,
    pub ePartOfSpeech: i32,
    pub Context: SPVCONTEXT,
}

#[repr(C)]
pub struct SPVTEXTFRAG {
    pub pNext: *mut core::ffi::c_void,
    pub State: SPVSTATE,
    pub pTextStart: *mut core::ffi::c_void,
    pub ulTextLen: u32,
    pub ulTextSrcOffset: u32,
}
import "golang.org/x/sys/windows"

type SPVPITCH struct {
	MiddleAdj int32
	RangeAdj int32
}

type SPVCONTEXT struct {
	pCategory uintptr
	pBefore uintptr
	pAfter uintptr
}

type SPVSTATE struct {
	eAction int32
	LangID uint16
	wReserved uint16
	EmphAdj int32
	RateAdj int32
	Volume uint32
	PitchAdj SPVPITCH
	SilenceMSecs uint32
	pPhoneIds uintptr
	ePartOfSpeech int32
	Context SPVCONTEXT
}

type SPVTEXTFRAG struct {
	pNext uintptr
	State SPVSTATE
	pTextStart uintptr
	ulTextLen uint32
	ulTextSrcOffset uint32
}
type
  SPVPITCH = record
    MiddleAdj: Integer;
    RangeAdj: Integer;
  end;

  SPVCONTEXT = record
    pCategory: Pointer;
    pBefore: Pointer;
    pAfter: Pointer;
  end;

  SPVSTATE = record
    eAction: Integer;
    LangID: Word;
    wReserved: Word;
    EmphAdj: Integer;
    RateAdj: Integer;
    Volume: DWORD;
    PitchAdj: SPVPITCH;
    SilenceMSecs: DWORD;
    pPhoneIds: Pointer;
    ePartOfSpeech: Integer;
    Context: SPVCONTEXT;
  end;

  SPVTEXTFRAG = record
    pNext: Pointer;
    State: SPVSTATE;
    pTextStart: Pointer;
    ulTextLen: DWORD;
    ulTextSrcOffset: DWORD;
  end;
const SPVPITCH = extern struct {
    MiddleAdj: i32,
    RangeAdj: i32,
};

const SPVCONTEXT = extern struct {
    pCategory: ?*anyopaque,
    pBefore: ?*anyopaque,
    pAfter: ?*anyopaque,
};

const SPVSTATE = extern struct {
    eAction: i32,
    LangID: u16,
    wReserved: u16,
    EmphAdj: i32,
    RateAdj: i32,
    Volume: u32,
    PitchAdj: SPVPITCH,
    SilenceMSecs: u32,
    pPhoneIds: ?*anyopaque,
    ePartOfSpeech: i32,
    Context: SPVCONTEXT,
};

const SPVTEXTFRAG = extern struct {
    pNext: ?*anyopaque,
    State: SPVSTATE,
    pTextStart: ?*anyopaque,
    ulTextLen: u32,
    ulTextSrcOffset: u32,
};
type
  SPVPITCH {.bycopy.} = object
    MiddleAdj: int32
    RangeAdj: int32

  SPVCONTEXT {.bycopy.} = object
    pCategory: pointer
    pBefore: pointer
    pAfter: pointer

  SPVSTATE {.bycopy.} = object
    eAction: int32
    LangID: uint16
    wReserved: uint16
    EmphAdj: int32
    RateAdj: int32
    Volume: uint32
    PitchAdj: SPVPITCH
    SilenceMSecs: uint32
    pPhoneIds: pointer
    ePartOfSpeech: int32
    Context: SPVCONTEXT

  SPVTEXTFRAG {.bycopy.} = object
    pNext: pointer
    State: SPVSTATE
    pTextStart: pointer
    ulTextLen: uint32
    ulTextSrcOffset: uint32
struct SPVPITCH
{
    int MiddleAdj;
    int RangeAdj;
}

struct SPVCONTEXT
{
    void* pCategory;
    void* pBefore;
    void* pAfter;
}

struct SPVSTATE
{
    int eAction;
    ushort LangID;
    ushort wReserved;
    int EmphAdj;
    int RateAdj;
    uint Volume;
    SPVPITCH PitchAdj;
    uint SilenceMSecs;
    void* pPhoneIds;
    int ePartOfSpeech;
    SPVCONTEXT Context;
}

struct SPVTEXTFRAG
{
    void* pNext;
    SPVSTATE State;
    void* pTextStart;
    uint ulTextLen;
    uint ulTextSrcOffset;
}

HSP用 定義

HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。

; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x86 レイアウト)
; SPVTEXTFRAG サイズ: 68 バイト(x86)
dim st, 17    ; 4byte整数×17(構造体サイズ 68 / 4 切り上げ)
; pNext : SPVTEXTFRAG* (+0, 4byte)  varptr(st)+0 を基点に操作(4byte:入れ子/配列)
; State : SPVSTATE (+4, 52byte)  varptr(st)+4 を基点に操作(52byte:入れ子/配列)
; pTextStart : LPWSTR (+56, 4byte)  st.14 = 値  /  値 = st.14   (lpoke/lpeek も可)
; ulTextLen : DWORD (+60, 4byte)  st.15 = 値  /  値 = st.15   (lpoke/lpeek も可)
; ulTextSrcOffset : DWORD (+64, 4byte)  st.16 = 値  /  値 = st.16   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; SPVTEXTFRAG サイズ: 96 バイト(x64)
dim st, 24    ; 4byte整数×24(構造体サイズ 96 / 4 切り上げ)
; pNext : SPVTEXTFRAG* (+0, 8byte)  varptr(st)+0 を基点に操作(8byte:入れ子/配列)
; State : SPVSTATE (+8, 72byte)  varptr(st)+8 を基点に操作(72byte:入れ子/配列)
; pTextStart : LPWSTR (+80, 8byte)  qpoke st,80,値 / qpeek(st,80)  ※IronHSPのみ。3.7/3.8は lpoke st,80,下位 : lpoke st,84,上位
; ulTextLen : DWORD (+88, 4byte)  st.22 = 値  /  値 = st.22   (lpoke/lpeek も可)
; ulTextSrcOffset : DWORD (+92, 4byte)  st.23 = 値  /  値 = st.23   (lpoke/lpeek も可)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。
; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
; ※GUID・入れ子構造体はデフォルト型でないため、依存する #defstruct を先に定義(下記に同梱)。
#defstruct global SPVPITCH
    #field int MiddleAdj
    #field int RangeAdj
#endstruct

#defstruct global SPVCONTEXT
    #field intptr pCategory
    #field intptr pBefore
    #field intptr pAfter
#endstruct

#defstruct global SPVSTATE
    #field int eAction
    #field short LangID
    #field short wReserved
    #field int EmphAdj
    #field int RateAdj
    #field int Volume
    #field SPVPITCH PitchAdj
    #field int SilenceMSecs
    #field intptr pPhoneIds
    #field int ePartOfSpeech
    #field SPVCONTEXT Context
#endstruct

#defstruct global SPVTEXTFRAG
    #field intptr pNext
    #field SPVSTATE State
    #field intptr pTextStart
    #field int ulTextLen
    #field int ulTextSrcOffset
#endstruct

stdim st, SPVTEXTFRAG        ; NSTRUCT 変数を確保
st->ulTextLen = 100
mes "ulTextLen=" + st->ulTextLen