WAVEFORMATEX
構造体サイズ=各フィールドのバイト数(x64/x86 で異なる場合は x64/x86 と併記)。x64/x86 列=フィールドのバイトオフセット(HSPで dupptr / lpoke / wpoke 等に使用)。
フィールド
| フィールド | 型 | サイズ | x64 | x86 | 説明 |
|---|---|---|---|---|---|
| wFormatTag | WORD | 2 | +0 | +0 | 波形オーディオの形式の種類です。多くの圧縮アルゴリズムについて、形式タグが Microsoft Corporation に登録されています。形式タグの完全な一覧は Mmreg.h ヘッダー ファイルにあります。1 チャネルまたは 2 チャネルの PCM データの場合、この値は WAVE_FORMAT_PCM にします。この構造体が WAVEFORMATEXTENSIBLE 構造体に含まれる場合、この値は WAVE_FORMAT_EXTENSIBLE でなければなりません。 |
| nChannels | WORD | 2 | +2 | +2 | 波形オーディオ データのチャネル数です。モノラル データは 1 チャネル、ステレオ データは 2 チャネルを使用します。 |
| nSamplesPerSec | DWORD | 4 | +4 | +4 | サンプル レート (1 秒あたりのサンプル数、ヘルツ単位) です。wFormatTag が WAVE_FORMAT_PCM の場合、nSamplesPerSec の一般的な値は 8.0 kHz、11.025 kHz、22.05 kHz、44.1 kHz です。PCM 以外の形式では、このメンバーは形式タグの製造元の仕様に従って計算する必要があります。 |
| nAvgBytesPerSec | DWORD | 4 | +8 | +8 | その形式タグで必要となる平均データ転送速度 (1 秒あたりのバイト数) です。wFormatTag が WAVE_FORMAT_PCM の場合、nAvgBytesPerSec は nSamplesPerSec と nBlockAlign の積と等しくなければなりません。PCM 以外の形式では、このメンバーは形式タグの製造元の仕様に従って計算する必要があります。 |
| nBlockAlign | WORD | 2 | +12 | +12 | ブロック アラインメント (バイト単位) です。ブロック アラインメントとは、wFormatTag の形式の種類におけるデータの最小単位です。wFormatTag が WAVE_FORMAT_PCM または WAVE_FORMAT_EXTENSIBLE の場合、nBlockAlign は nChannels と wBitsPerSample の積を 8 (1 バイトあたりのビット数) で割った値と等しくなければなりません。PCM 以外の形式では、このメンバーは形式タグの製造元の仕様に従って計算する必要があります。 ソフトウェアは、一度に nBlockAlign の倍数のバイト数のデータを処理しなければなりません。デバイスに書き込むデータおよびデバイスから読み取るデータは、常にブロックの先頭から開始する必要があります。たとえば、サンプルの途中 (つまりブロック境界に整列していない位置) から PCM データの再生を開始することはできません。 |
| wBitsPerSample | WORD | 2 | +14 | +14 | wFormatTag の形式の種類における 1 サンプルあたりのビット数です。wFormatTag が WAVE_FORMAT_PCM の場合、wBitsPerSample は 8 または 16 にします。PCM 以外の形式では、このメンバーは形式タグの製造元の仕様に従って設定する必要があります。wFormatTag が WAVE_FORMAT_EXTENSIBLE の場合、この値は 8 の任意の整数倍にでき、サンプル サイズではなくコンテナー サイズを表します。たとえば、20 ビットのサンプル サイズは 24 ビットのコンテナーに格納されます。一部の圧縮方式では wBitsPerSample の値を定義できないため、このメンバーは 0 になることがあります。 |
| cbSize | WORD | 2 | +16 | +16 | WAVEFORMATEX 構造体の末尾に付加される追加の形式情報のサイズ (バイト単位) です。この情報は、PCM 以外の形式が wFormatTag に対する追加の属性を格納するために使用できます。wFormatTag が追加情報を必要としない場合、このメンバーは 0 に設定しなければなりません。WAVE_FORMAT_PCM 形式 (WAVE_FORMAT_PCM 形式のみ) では、このメンバーは無視されます。この構造体が WAVEFORMATEXTENSIBLE 構造体に含まれる場合、この値は 22 以上でなければなりません。 |
公式ドキュメント
WAVEFORMATEX 構造体は、波形オーディオ データの形式を定義します。この構造体には、すべての波形オーディオ データ形式に共通する形式情報のみが含まれます。追加情報を必要とする形式では、この構造体が別の構造体の最初のメンバーとして組み込まれ、追加情報と共に使用されます。
2 チャネルを超えるチャネル数や 16 ビットを超えるサンプル サイズをサポートする形式は、WAVEFORMATEXTENSIBLE 構造体で記述できます。この構造体には WAVEFORMAT 構造体が含まれます。
解説(Remarks)
追加情報を使用する形式の例として、Microsoft Adaptive Delta Pulse Code Modulation (MS-ADPCM) 形式があります。MS-ADPCM の wFormatTag は WAVE_FORMAT_ADPCM です。cbSize メンバーは通常 32 に設定されます。WAVE_FORMAT_ADPCM で格納される追加情報は、波形オーディオ データのエンコードおよびデコードに必要な係数のペアです。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
各言語での定義
#include <windows.h>
// WAVEFORMATEX (x64 18 / x86 18 バイト)
#pragma pack(push, 1)
typedef struct WAVEFORMATEX {
WORD wFormatTag;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesPerSec;
WORD nBlockAlign;
WORD wBitsPerSample;
WORD cbSize;
} WAVEFORMATEX;
#pragma pack(pop)using System;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode)]
public struct WAVEFORMATEX
{
public ushort wFormatTag;
public ushort nChannels;
public uint nSamplesPerSec;
public uint nAvgBytesPerSec;
public ushort nBlockAlign;
public ushort wBitsPerSample;
public ushort cbSize;
}Imports System.Runtime.InteropServices
<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Unicode)>
Public Structure WAVEFORMATEX
Public wFormatTag As UShort
Public nChannels As UShort
Public nSamplesPerSec As UInteger
Public nAvgBytesPerSec As UInteger
Public nBlockAlign As UShort
Public wBitsPerSample As UShort
Public cbSize As UShort
End Structureimport ctypes
from ctypes import wintypes
class WAVEFORMATEX(ctypes.Structure):
_pack_ = 1
_fields_ = [
("wFormatTag", ctypes.c_ushort),
("nChannels", ctypes.c_ushort),
("nSamplesPerSec", wintypes.DWORD),
("nAvgBytesPerSec", wintypes.DWORD),
("nBlockAlign", ctypes.c_ushort),
("wBitsPerSample", ctypes.c_ushort),
("cbSize", ctypes.c_ushort),
]#[repr(C, packed(1))]
pub struct WAVEFORMATEX {
pub wFormatTag: u16,
pub nChannels: u16,
pub nSamplesPerSec: u32,
pub nAvgBytesPerSec: u32,
pub nBlockAlign: u16,
pub wBitsPerSample: u16,
pub cbSize: u16,
}import "golang.org/x/sys/windows"
type WAVEFORMATEX struct {
wFormatTag uint16
nChannels uint16
nSamplesPerSec uint32
nAvgBytesPerSec uint32
nBlockAlign uint16
wBitsPerSample uint16
cbSize uint16
}type
WAVEFORMATEX = packed record
wFormatTag: Word;
nChannels: Word;
nSamplesPerSec: DWORD;
nAvgBytesPerSec: DWORD;
nBlockAlign: Word;
wBitsPerSample: Word;
cbSize: Word;
end;const WAVEFORMATEX = extern struct {
wFormatTag: u16,
nChannels: u16,
nSamplesPerSec: u32,
nAvgBytesPerSec: u32,
nBlockAlign: u16,
wBitsPerSample: u16,
cbSize: u16,
};type
WAVEFORMATEX {.packed.} = object
wFormatTag: uint16
nChannels: uint16
nSamplesPerSec: uint32
nAvgBytesPerSec: uint32
nBlockAlign: uint16
wBitsPerSample: uint16
cbSize: uint16align(1)
struct WAVEFORMATEX
{
ushort wFormatTag;
ushort nChannels;
uint nSamplesPerSec;
uint nAvgBytesPerSec;
ushort nBlockAlign;
ushort wBitsPerSample;
ushort cbSize;
}HSP用 定義
HSP3.7/3.8 は構造体機能が無いため4byte整数配列(dim)+peek/poke で操作(32/64bitでサイズ・位置が異なる場合はタブで分割)。IronHSP は NSTRUCT(#defstruct/stdim/->)で32/64bit共通。
; HSP3.7/3.8 は構造体機能が無いため、4byte整数の配列変数で操作します。(x64 レイアウト)
; WAVEFORMATEX サイズ: 18 バイト(x64)
dim st, 5 ; 4byte整数×5(構造体サイズ 18 / 4 切り上げ)
; wFormatTag : WORD (+0, 2byte) wpoke st,0,値 / 値 = wpeek(st,0)
; nChannels : WORD (+2, 2byte) wpoke st,2,値 / 値 = wpeek(st,2)
; nSamplesPerSec : DWORD (+4, 4byte) st.1 = 値 / 値 = st.1 (lpoke/lpeek も可)
; nAvgBytesPerSec : DWORD (+8, 4byte) st.2 = 値 / 値 = st.2 (lpoke/lpeek も可)
; nBlockAlign : WORD (+12, 2byte) wpoke st,12,値 / 値 = wpeek(st,12)
; wBitsPerSample : WORD (+14, 2byte) wpoke st,14,値 / 値 = wpeek(st,14)
; cbSize : WORD (+16, 2byte) wpoke st,16,値 / 値 = wpeek(st,16)
; ※4byte境界の整数は添字 st.N(N=オフセット/4)で読み書き可。それ以外は peek/poke 系を使用。; IronHSP は NSTRUCT(構造体)をサポート。32bit/64bit どちらでも同じコードで動作します。
#defstruct global WAVEFORMATEX, pack=1
#field short wFormatTag
#field short nChannels
#field int nSamplesPerSec
#field int nAvgBytesPerSec
#field short nBlockAlign
#field short wBitsPerSample
#field short cbSize
#endstruct
stdim st, WAVEFORMATEX ; NSTRUCT 変数を確保
st->wFormatTag = 100
mes "wFormatTag=" + st->wFormatTag