Skip to main content

Wrapper for reading and modifying VMD and PMX files

Project description

PyPMXVMD

Python MikuMikuDance File Parser Library

Python Version License Version

PyPMXVMD is a Python library for parsing and modifying MikuMikuDance (MMD) files, supporting the following formats:

  • VMD (Vocaloid Motion Data) - Motion/animation data
  • PMX (Polygon Model eXtended) - 3D model data
  • VPD (Vocaloid Pose Data) - Pose data

Features

  • Full support for reading and writing VMD, PMX, and VPD files
  • Conversion between binary and text formats
  • Object-oriented API design, easy to use
  • Complete type annotation support
  • Optional Cython acceleration for core parsing and binary I/O (average 3.7x faster than the previous path)
  • No external dependencies (core functionality)
  • Supports Python 3.8+

Installation

# Install from source
git clone https://github.com/pypmxvmd/pypmxvmd.git
cd pypmxvmd
pip install -e .

# Install development dependencies
pip install -e ".[dev]"

Optional: Build Cython Accelerators

The core parsing path supports Cython-accelerated modules for VMD/PMX and binary I/O. In typical workloads, the Cython implementation is ~3.7x faster on average than the previous implementation. Prebuilt Cython binaries are only provided for Python 3.11; other Python versions need to compile locally. If the compiled modules are not available, the library automatically falls back to pure Python.

pip install cython
python scripts/build_cython.py

Quick Start

Basic Usage

import pypmxvmd

# Load VMD motion file
motion = pypmxvmd.load_vmd("motion.vmd")
print(f"Bone frames: {len(motion.bone_frames)}")
print(f"Morph frames: {len(motion.morph_frames)}")

# Modify and save
pypmxvmd.save_vmd(motion, "modified_motion.vmd")

# Load PMX model file
model = pypmxvmd.load_pmx("model.pmx")
print(f"Vertices: {len(model.vertices)}")
print(f"Materials: {len(model.materials)}")

# Load VPD pose file
pose = pypmxvmd.load_vpd("pose.vpd")
print(f"Bone poses: {len(pose.bone_poses)}")

Automatic Format Detection

import pypmxvmd

# Automatically detect file type and load
data = pypmxvmd.load("file.vmd")  # Returns VmdMotion
data = pypmxvmd.load("file.pmx")  # Returns PmxModel
data = pypmxvmd.load("file.vpd")  # Returns VpdPose

# Automatically detect data type and save
pypmxvmd.save(motion, "output.vmd")
pypmxvmd.save(model, "output.pmx")
pypmxvmd.save(pose, "output.vpd")

Text Format Conversion

PyPMXVMD supports converting binary files to readable text format for viewing and editing:

import pypmxvmd

# VMD -> Text
motion = pypmxvmd.load_vmd("motion.vmd")
pypmxvmd.save_vmd_text(motion, "motion.txt")

# Text -> VMD
motion = pypmxvmd.load_vmd_text("motion.txt")
pypmxvmd.save_vmd(motion, "motion.vmd")

# PMX -> Text
model = pypmxvmd.load_pmx("model.pmx")
pypmxvmd.save_pmx_text(model, "model.txt")

# VPD -> Text
pose = pypmxvmd.load_vpd("pose.vpd")
pypmxvmd.save_vpd_text(pose, "pose.txt")

Using Parser Classes

If you need more control, you can use the parser classes directly:

from pypmxvmd import VmdParser, PmxParser, VpdParser

# VMD Parser
vmd_parser = VmdParser()
motion = vmd_parser.parse_file("motion.vmd", more_info=True)
vmd_parser.write_file(motion, "output.vmd")

# PMX Parser
pmx_parser = PmxParser()
model = pmx_parser.parse_file("model.pmx", more_info=True)
pmx_parser.write_file(model, "output.pmx")

# VPD Parser
vpd_parser = VpdParser()
pose = vpd_parser.parse_file("pose.vpd", more_info=True)
vpd_parser.write_file(pose, "output.vpd")

Data Structures

VmdMotion (VMD Motion)

class VmdMotion:
    header: VmdHeader           # File header information
    bone_frames: List[VmdBoneFrame]      # Bone keyframes
    morph_frames: List[VmdMorphFrame]    # Morph keyframes
    camera_frames: List[VmdCameraFrame]  # Camera keyframes
    light_frames: List[VmdLightFrame]    # Light keyframes
    shadow_frames: List[VmdShadowFrame]  # Shadow keyframes
    ik_frames: List[VmdIkFrame]          # IK keyframes

PmxModel (PMX Model)

class PmxModel:
    header: PmxHeader           # File header information
    vertices: List[PmxVertex]   # Vertex list
    faces: List[int]            # Face indices
    textures: List[str]         # Texture paths
    materials: List[PmxMaterial]  # Material list
    bones: List[PmxBone]        # Bone list
    morphs: List[PmxMorph]      # Morph list
    frames: List[PmxFrame]      # Display frames
    rigidbodies: List[PmxRigidBody]  # Rigidbody list
    joints: List[PmxJoint]      # Joint list

VpdPose (VPD Pose)

class VpdPose:
    model_name: str             # Model name
    bone_poses: List[VpdBonePose]   # Bone pose list
    morph_poses: List[VpdMorphPose] # Morph pose list

API Reference

Core Functions

Function Description
load_vmd(path) Load VMD file
save_vmd(motion, path) Save VMD file
load_pmx(path) Load PMX file
save_pmx(model, path) Save PMX file
load_vpd(path) Load VPD file
save_vpd(pose, path) Save VPD file
load(path) Auto-detect and load
save(data, path) Auto-detect and save

Text Format Functions

Function Description
load_vmd_text(path) Load VMD from text
save_vmd_text(motion, path) Save VMD as text
load_pmx_text(path) Load PMX from text
save_pmx_text(model, path) Save PMX as text
load_vpd_text(path) Load VPD from text
save_vpd_text(pose, path) Save VPD as text
load_text(path) Auto-detect and load text
save_text(data, path) Auto-detect and save text

Project Structure

pypmxvmd/
├── pypmxvmd/                      # Main package
│   ├── __init__.py            # Public API
│   ├── common/                # Common components
│   │   ├── models/            # Data models
│   │   │   ├── vmd.py        # VMD data structures
│   │   │   ├── pmx.py        # PMX data structures
│   │   │   └── vpd.py        # VPD data structures
│   │   └── parsers/           # Parsers
│   │       ├── vmd_parser_nuthouse.py
│   │       ├── pmx_parser_nuthouse.py
│   │       └── vpd_parser.py
│   └── presentation/          # Presentation layer
│       ├── cli/               # Command-line interface
│       └── gui/               # Graphical interface
├── tests/                     # Tests
├── docs/                      # Documentation
└── mmd_scripting/             # Legacy code (reference)

Testing

# Run all tests
pytest tests/ -v

# Run specific test
pytest tests/test_vmd_parser.py -v

# Run coverage test
pytest tests/ --cov=pypmxvmd --cov-report=html

Development

# Install development dependencies
pip install -e ".[dev]"

# Code formatting
black pypmxvmd/
isort pypmxvmd/

# Type checking
mypy pypmxvmd/

# Code linting
flake8 pypmxvmd/

Version History

v2.5.1

  • Added optional Cython acceleration for core parsing and binary I/O
  • Cython path averages ~3.7x faster than the previous implementation

v2.0.0 (2024)

  • Complete refactor to object-oriented architecture
  • Added complete type annotations
  • Support for text format export/import
  • Improved error handling and validation
  • Added progress callback support

v1.x (Original)

  • Based on Nuthouse01's original implementation
  • Functional API

Acknowledgments

This project is refactored from the original MMD scripting tools by Nuthouse01.

License

MIT License - See LICENSE file for details

Contributing

Issues and Pull Requests are welcome!

  1. Fork this repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Create a Pull Request

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pypmxvmd-2.6.1.tar.gz (631.1 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pypmxvmd-2.6.1-cp313-cp313-win_amd64.whl (739.1 kB view details)

Uploaded CPython 3.13Windows x86-64

pypmxvmd-2.6.1-cp312-cp312-win_amd64.whl (740.6 kB view details)

Uploaded CPython 3.12Windows x86-64

pypmxvmd-2.6.1-cp311-cp311-win_amd64.whl (624.8 kB view details)

Uploaded CPython 3.11Windows x86-64

pypmxvmd-2.6.1-cp310-cp310-win_amd64.whl (740.3 kB view details)

Uploaded CPython 3.10Windows x86-64

pypmxvmd-2.6.1-cp39-cp39-win_amd64.whl (741.4 kB view details)

Uploaded CPython 3.9Windows x86-64

pypmxvmd-2.6.1-cp38-cp38-win_amd64.whl (624.8 kB view details)

Uploaded CPython 3.8Windows x86-64

File details

Details for the file pypmxvmd-2.6.1.tar.gz.

File metadata

  • Download URL: pypmxvmd-2.6.1.tar.gz
  • Upload date:
  • Size: 631.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.17

File hashes

Hashes for pypmxvmd-2.6.1.tar.gz
Algorithm Hash digest
SHA256 469149fda0a5f79814acf86700c7a8c843ec5f74892dedbdbcb3be1f183f5973
MD5 ba53a362f46cad79e39d1208f574cc32
BLAKE2b-256 9142aafa0b0f800b9d611147deb054df3d94e6171ce4c9c8c096de2d21abe501

See more details on using hashes here.

File details

Details for the file pypmxvmd-2.6.1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for pypmxvmd-2.6.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 b346a54478cdc5480c561ce6493d2c279363b98a36b74a0ddff3ef48bc390e74
MD5 3e5d4b5ca0c123e3145783fdbe75cd2e
BLAKE2b-256 53489fbd8305ddcabc28157292776892643d0cd603e5da3e5d2e6efde245122f

See more details on using hashes here.

File details

Details for the file pypmxvmd-2.6.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for pypmxvmd-2.6.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 cdeb85ff1ae6a9706f0ebea58590f81681d0c3e620e352a0804cd2c04a8706b0
MD5 d3c83ab1b33fbf75f7c9b29bb8414dd8
BLAKE2b-256 a21e9ccc09c706ed70a10cecf9b86c72566986b8e6b3f3157a672d5a16b697b4

See more details on using hashes here.

File details

Details for the file pypmxvmd-2.6.1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for pypmxvmd-2.6.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 466494eb930edc1ce52049f60680fed877a8d553337e73524c5bdd47ea1d33f0
MD5 f1d55eb3dd91306bb2211010e048f984
BLAKE2b-256 462355762d74569ce695ffd30c0b0985976d061e2ee503bedffa5302e111244f

See more details on using hashes here.

File details

Details for the file pypmxvmd-2.6.1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for pypmxvmd-2.6.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 2e1613779fb6659659deea8400bf33a5ba4f68c42ab036a2c6fabb7c16ee7e54
MD5 a13f458a9a211e1c80b547dbe0a39913
BLAKE2b-256 832d0cb4e20096879cd8679c0b83662dcc7785b65ef449242ac4171f8fc62f5b

See more details on using hashes here.

File details

Details for the file pypmxvmd-2.6.1-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: pypmxvmd-2.6.1-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 741.4 kB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.17

File hashes

Hashes for pypmxvmd-2.6.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 b066e8ff75e74b7b8568e0594994ec4263fe9e487587ce6851542efa99c67d27
MD5 1c2de2699e9a49787ed839b14ac67a66
BLAKE2b-256 f6d4b93a06df00503d839225b1e659f01dc31457bfbad6fe2a1cbaef541e7331

See more details on using hashes here.

File details

Details for the file pypmxvmd-2.6.1-cp38-cp38-win_amd64.whl.

File metadata

  • Download URL: pypmxvmd-2.6.1-cp38-cp38-win_amd64.whl
  • Upload date:
  • Size: 624.8 kB
  • Tags: CPython 3.8, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.6.17

File hashes

Hashes for pypmxvmd-2.6.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 de648ccaffeabd23e92ba763f4f3793baa3ce6d2c9a15f4778488d05604a12b4
MD5 44044ef6464459aa0b39ee20db5414c5
BLAKE2b-256 4db63e478d38fed0d43fc6003aae701e80d435f0c28fb39de669b2c3d38b2ca2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page