OMP3 是一个探索数字气味播放描述协议与软件模拟的个人想法与研究原型。
声明与项目边界
本项目纯属个人探索性研究原型,旨在定义与校验结构化的数字播放时间线协议。本项目目前完全没有实现真实气味记录、物理释放或气味重现能力,未来可能会根据研究进展继续开发。请勿将本项目理解为已完成的产品或具备实际气味播放能力的系统。
- 数据格式标准 (.omp3):定义基于 JSON 的气味播放时间线描述规范,支持多通道编排、强度曲线与 ADSR 包络控制。
- 协议校验器 (Validator):严格校验格式元数据、未知字段、数值边界、包络完整性、通道唯一性与安全防护限制。
- 软件播放模拟器 (Simulator):纯软件模拟离散播放时间线事件(包含通道、瞬时强度、时间戳、包络状态),输出机器可读的事件流。
- 本地可视化播放器 (Visual Player):纯标准库零外部依赖的本地 Web 服务器与交互式单页可视化播放器,支持文件加载校验、元数据与轨道包络展示、高精度时间线模拟与播放控制(播放/暂停/复位/进度拖拽与瞬时强度监视)。
- CLI 工具与测试套件:提供
validate、simulate与serve命令行接口及完备自动化测试。
- 不记录与采样真实气味:不涉及电子鼻硬件接入、气敏传感器数据采集或色谱/质谱分析。
- 不驱动物理执行机构:不控制雾化喷头、风扇、加热阀门或微流控芯片。
- 不生成化学配方:不处理精油配比、香精分子合成或化学安全评定。
- 不声称重现气味:所有输出均为协议层与时间线状态的纯数字模拟。
首版 .omp3 为标准 JSON 文档,核心包含以下五个顶级节点:
{
"format": "omp3",
"version": "0.1.0",
"metadata": {
"title": "Cedar & Citrus Ambient Accord",
"description": "A research prototype digital playback timeline. Does not record or reproduce physical odors.",
"author": "Personal Research Project",
"created_at": "2026-09-07T00:00:00Z",
"tags": ["prototype", "ambient"]
},
"safety_guard": {
"max_intensity": 1.0,
"max_continuous_duration_ms": 10000,
"min_interval_ms": 200,
"max_total_channels": 16,
"max_concurrent_channels": 4,
"cooldown_ms": 1000
},
"tracks": [
{
"channel": 1,
"name": "Simulated Sweet Orange Accord",
"description": "Primary high-volatility mock channel",
"start_time_ms": 0,
"intensity": 0.8,
"duration_ms": 3000,
"envelope": {
"attack_ms": 300,
"decay_ms": 400,
"sustain_level": 0.6,
"release_ms": 500
}
}
]
}format: 格式标识,必须为"omp3"。version: 协议版本号(如"0.1.0")。metadata: 文件元信息,必须包含title、description和author。safety_guard: 播放安全防线,所有限制数值禁止为负数:max_intensity: 播放强度上限(范围[0.0, 1.0])。max_continuous_duration_ms: 单轨连续播放时长上限(毫秒)。min_interval_ms: 触发最小间隔(毫秒)。max_total_channels: 允许的最大总通道数。max_concurrent_channels: 最大并发激活通道数。
tracks: 播放轨道列表:channel: 通道标识符(正整数或非空字符串),同一文件内必须唯一。intensity: 峰值强度(范围[0.0, 1.0],且不得超过safety_guard.max_intensity)。duration_ms: 播放总时长(必须大于 0,且满足包络覆盖条件)。envelope: ADSR 包络参数:attack_ms: 爬升阶段时长(毫秒,>= 0)。decay_ms: 衰减阶段时长(毫秒,>= 0)。sustain_level: 维持阶段强度比例(范围[0.0, 1.0])。release_ms: 释放归零时长(毫秒,>= 0)。- 约束条件:
duration_ms >= attack_ms + decay_ms + release_ms。
- Python 3.11+
- 无第三方运行时依赖(核心协议与软件模拟仅使用 Python 标准库)。
本项目采用标准 src 布局(src/omp3)。在全新的干净检出环境中,必须先在仓库根目录执行本地安装(如可编辑安装),以确保模块路径注册与 CLI 命令生效:
python -m pip install -e .注意:本项目不声称在未经本地安装或未配置模块路径的情况下可直接导入
omp3模块。执行上述安装后,方可直接通过python -m omp3.cli或安装生成的omp3命令执行后续操作。
使用 validate 子命令校验输入文件,输出格式化 JSON:
python -m omp3.cli validate examples/demo.omp3.json
# 或直接使用安装好的 CLI 命令:
omp3 validate examples/demo.omp3.json成功输出示例:
{
"status": "valid",
"file": "examples/demo.omp3.json",
"format": "omp3",
"version": "0.1.0",
"metadata": { ... },
"track_count": 2,
"total_duration_ms": 4500,
"channels": [1, 2],
"warnings": []
}使用 simulate 子命令生成纯软件播放事件流:
python -m omp3.cli simulate examples/demo.omp3.json
# 或直接使用安装好的 CLI 命令:
omp3 simulate examples/demo.omp3.json成功输出示例:
{
"status": "success",
"file": "examples/demo.omp3.json",
"simulation": {
"simulation_type": "software_mock",
"safety_notice": "Pure software playback timeline simulation. No physical actuation or odor emission.",
"total_duration_ms": 4500,
"track_count": 2,
"active_channels": [1, 2],
"max_concurrent_active_channels": 2,
"peak_intensity": 0.8,
"events": [
{
"time_ms": 0,
"channel": 1,
"state": "ATTACK",
"intensity": 0.0,
"description": "Channel 1: Attack phase started (target 0.80)"
},
...
]
}
}可选参数 --step-ms N 支持按固定毫秒步长采样瞬时强度曲线:
python -m omp3.cli simulate examples/demo.omp3.json --step-ms 200使用 serve 子命令启动完全无外部依赖的本地 Web 可视化播放器与模拟器:
# 启动播放器并预载示例文件(自动打开默认系统浏览器):
python -m omp3.cli serve examples/demo.omp3.json
# 或直接使用安装好的 CLI 命令:
omp3 serve examples/demo.omp3.json
# 启动空播放器(可在浏览器页面中通过本地文件选择器或拖拽加载文件):
python -m omp3.cli serve可选参数:
--host HOST: 监听的网络接口地址(默认127.0.0.1)--port PORT: 监听端口(默认8080)--no-browser: 禁止在服务启动时自动打开系统浏览器
安全与模拟器边界提醒
可视化播放器仅供纯软件模拟与视觉化展示,所有轨道包络、瞬时强度与时间线演进均为数字状态演算。严禁假定其具备真实气味记录、化学合成或物理喷发能力。
项目采用 Python 标准库 unittest 编写完备测试套件,可直接运行:
python -m unittest discover -s tests -v若环境中安装了 pytest,亦可直接使用:
pytest -v测试套件完整覆盖:
- 基础模型构建与字典序列化/反序列化(Roundtrip)。
- 关键字段缺失、未知字段注入的强校验拦截。
- 越界强度、负数安全限制、单轨通道重复的错误处理。
- 包络时长覆盖不足(
duration_ms < attack + decay + release)的拦截。 - 纯软件时间线模拟事件时序、状态转换与峰值聚合正确性。
- CLI 命令返回值、异常退出码与 JSON 输出格式契约。
- Web 可视化播放器 HTTP 基础路由、API 端点(
/api/status、/api/document、/api/load、/api/evaluate、/api/validate、/api/reset)与安全边界(防目录穿越、方法校验、非法负载防崩溃)。 - CLI
serve子命令参数解析、非法文件路径与格式拦截及预加载容错性。
- 时钟与音画同步协议:研究基于 SMPTE / 毫秒级外部时间码的气味播放事件对齐协议。
- 气味通道描述映射库:探索通道编号与标准香调分类(如香味轮轮廓分类)的元数据挂载标准。
- 硬件抽象层(HAL)参考接口:定义安全、不可逆的硬件接口抽象层规范,用于未来概念硬件的防呆与防过载验证。