跳至项目内容
SonicWEB
传感器原型Max/MSP空间音频体感交互

SonicWEB — Audio Experience Installation

交互演示

给自己做个
蛛丝发射器。

SonicWEB 是一套受蜘蛛侠启发的体感控制器,将肌肉信号、手臂动作与空间声音接入游戏。抬手瞄准、握紧发射,在声音的指引下完成一次次摆荡。

02 / The Experience

先听准方向,
再发射蛛丝。

声塔藏在视野之外,耳机里的声音会提示它在哪边。抬起手臂瞄准,握紧握力器,蛛丝就会射向目标,带你向前摆荡。松开手,再找下一座声塔。

现场演示 01:51建议佩戴耳机
SonicWEB 的传感器、手机姿态追踪与硬件设置
装置原型 / MMG 传感与手臂姿态输入
  1. 01听声音找方向
  2. 02抬手瞄准、握紧
  3. 03发射蛛丝,向前摆荡
  4. 04松手,寻找下个目标

03 / Sound-Led Play

看不见目标,试着听。

前方的视野受到限制,声音成为寻找目标的主要线索。需要选择方向时,游戏会短暂进入慢动作,留出听辨和瞄准的时间。命中目标后继续摆荡,方向错误时则给出反馈,进入下一次尝试。

游戏慢动作窗口中的隐藏目标与有限视野
游戏原型 / 发射时机
向正确目标发射后的游戏反馈
命中目标 / 继续摆荡
发射方向错误时的游戏反馈
方向错误 / 重新尝试

声音负责引路,画面帮助确认结果。这里展示的是游戏原型的静帧。

04 / Mechanomyography

麦克风能听见
肌肉吗?

肌肉收缩会带来细微的机械振动,记录这些变化得到的就是 MMG(肌机械信号)。SonicWEB 用它识别握紧与松手,让肌肉活动成为游戏输入。

传感器贴在前臂上,通过薄膜和声腔把振动传给麦克风。比较不同佩戴位置后,选用较易定位、表面相对平坦的桡侧腕伸肌区域。

肌肉活动记录的时频分析图
原型测试 / 时频分析

本次记录的分析中,能量主要集中在 5–60 Hz 范围。该观察用于指导原型滤波,不代表所有 MMG 信号的固定范围。

05 / Building the Sensor

先做一个能贴在手臂上的麦克风。

传感器由贴肤薄膜、密封声腔和 MEMS 麦克风组成。振动从皮肤传到薄膜,再经声腔传给麦克风。声腔的形状与密封程度,也会影响信号的采集。

膜片、声腔及 MEMS 麦克风的结构示意
传感器结构 / 1 麦克风 · 2 声腔 · 3 贴肤膜片
01

贴肤膜片

接收皮肤表面的细微振动。

02

密封声腔

将振动传递为腔内压力变化。

03

MEMS 麦克风

把压力变化转化为可采集的电信号。

不同声腔尺寸的打印样件与封装后的传感器
从打印声腔,到密封后的传感器样件
硬件实现 / 采样与传输怎样把传感器接入电脑?

先把采样节奏稳住

Arduino 通过定时器中断采集麦克风信号,把采样与串口发送分开。采样结果先写入环形缓冲区,再由主循环送往电脑。

让串口跟得上

原型把 10 位 ADC 数据缩减为 8 位,通过 115200 波特率串口发送。这样减少传输量,也牺牲了部分幅值分辨率。

  1. 01定时器触发采样
  2. 02写入环形缓冲区
  3. 03主循环串口发送
  4. 04Max 接收与处理

115200 表示串口波特率;实际采样率与端到端延迟需分别测量。

06 / Iteration

让微弱的振动更清晰。

薄膜材料、声腔尺寸和贴合方式,都会影响振动的传递。通过逐项比较与调整,改善信号采集,也让传感器在手臂活动时保持贴合。

01 / 膜片

比较三种薄膜

对比材料包括保鲜膜、胶带和乳胶膜。本次测试中,保鲜膜的振动传递较清晰,因此用于后续原型。

02 / 声腔

调整声腔尺寸

比较不同腔体后,选用直径约 10 mm、高约 5 mm 的尺寸,兼顾振动传递与佩戴体积。

03 / 固定

减少活动中的滑移

用肌内效贴固定传感器,再做好封装密封,尽量减少手臂活动时的松动和外界干扰。

以上为本项目原型试验中的选择与观察。

07 / Signal to Action

握住不放,也只发射一次。

一次握紧对应一次发射。程序先平滑信号,再用两个阈值区分握紧与松手;持续握持时保持当前状态,松开后才允许下一次触发,避免信号波动造成连发。

01
放松时的握持动作

放松

先听清目标在哪边。

02
握紧时的握持动作

握紧

超过触发阈值,发射蛛丝。

03
释放时的握持动作

释放

降到释放阈值以下,松开蛛丝。

  1. 01MMG 信号
  2. 02幅值特征与平滑
  3. 03双阈值判断
  4. 04触发 / 保持 / 释放
Max/MSP / 程序总览这张 Max 程序是怎么搭起来的?

先接收传感器信号,再分成两条路径:一条判断动作何时发生,一条把持续变化变成声音。动作事件同时控制预录音效和游戏输入。

SonicWEB Max Patch 总览,包含输入、触发、声音处理与游戏连接
Max/MSP 程序 / 系统总览
查看大图
  1. 01输入与调理串口读取、数值映射、插值与滤波。
  2. 02动作判断幅值包络、平滑、双阈值与状态变化。
  3. 03连续声音移调、动态滤波与包络控制。
  4. 04事件音效发射与收回,对应不同播放命令。
  5. 05游戏连接把触发消息交给键盘事件桥接。
Max/MSP / 输入与平滑让一串数字变成连续信号
串口输入经 scale、pack、line~ 和 svf~ 处理的 Max 程序
输入模块 / 节点与连线
查看大图

先把数值范围调好

使用串口对象读取传感器数据。通过 scale 0 255 -1. 1. 映射数值,再对幅值进行调整。

让数值平滑过渡

pack 0. 2 为目标值附加 2 ms 过渡时间,再交给 line~ 生成信号斜坡,使离散变化可以进入后续音频处理。

处理基线与低频干扰

使用 svf~ 的高通输出处理直流偏置与基线干扰。输入调理之后,信号进入动作判断和声音处理分支。

对象说明:line~ · svf~

图中的数值是这版 Patch 的调试配置;2 ms 表示插值时间,不是已测得的整体响应延迟。滤波设置需要结合有效信号频段重新检查。

Max/MSP / 动作状态握紧和松手,程序怎么分得清?
RMS、snapshot~、slide、比较器、change 与 sel 组成的触发逻辑
触发模块 / 节点与连线
查看大图

先看信号有多强

先计算 RMS,再用 snapshot~ 30 每 30 ms 读出一个数值。这里是在软件中读取信号值,并不是再做一次硬件模数转换。

上升和下降分开平滑

slide 对数值变化进行平滑。使用不同的上升、下降参数,减少细小波动造成的状态切换。

握紧和松手各设一个阈值

超过上阈值进入握持状态;低于下阈值退出。两者之间保留当前状态,避免在一个临界值附近反复触发。

只传递状态改变

change 过滤连续重复的值,sel 1 0 再区分握紧和释放。持续握持时保持状态,松开后才允许下一次触发。

对象说明:snapshot~ · change

RMS 描述信号幅值,不能直接当作实际握力。触发逻辑用于本次原型,不代表已验证所有用户和佩戴条件下的稳定性。

Max/MSP / 校准探索换个人玩,阈值怎么办?
基线校准脚本,记录统计量并计算触发与释放阈值
校准脚本 / 个体阈值探索
查看大图

记录当前佩戴状态的信号

校准方案在游戏开始前收集一段个人信号,以均值和标准差计算阈值,让动作判断适应当前用户与佩戴状态。

阈值计算

触发阈值 = 均值 + 3 × 标准差

释放阈值 = 均值 + 0.5 × 标准差

校准后检查动作识别

确认放松、握紧、松开能形成清楚的状态变化;调整佩戴位置或更换用户后,需要重新检查基线与阈值。

固定阈值用于动作判断原型,动态校准是进一步的探索;校准效果仍需跨用户测试。

08 / Body as Sound

给蛛丝配上声音。

短音效回应发射与松开的瞬间,连续变化的声音则随肌肉信号调整。两路反馈结合,让玩家既能确认动作,也能听见拉住蛛丝时的张力变化。

Event / 事件反馈

射出去,再收回来。

为发射、命中和松开准备不同的音效。听到声音,就知道刚才的动作有没有发生。

发射命中释放

Continuous / 连续反馈

握紧一点,声音也跟着变。

先把低频肌肉信号移调,再用幅值控制滤波,让音色跟着用力过程变化。声音的起止也经过包络处理,接得更自然。

肌肉信号音高与音色
声音实现 / 连续变化让肌肉信号参与配音
pitchshift~、lores~ 和 adsr~ 组成的肌肉声音处理模块
连续声音分支 / 节点与连线
查看大图

先把低频信号移调

使用 pitchshift~ 改变肌肉信号的音高,将输入转化为更适合游戏语境的声音材料。

用信号幅值调节音色

幅值控制量经 scaleline~ 平滑后,调节 lores~ 的滤波参数,让用力过程表现为连续的音色变化。

让声音自然开始和结束

adsr~ 控制声音进入、保持和消退的过程,使反馈能衔接动作,而不是突然出现或中断。

这里映射的是传感信号的变化,声音并非对肌肉力量的定量读数。

声音实现 / 动作事件蛛丝射出和收回,该是什么声音?
由 change、sel 1 0 触发发射与收回音效的 Max 模块
事件音效分支 / 节点与连线
查看大图

先给动作一个明确的回应

握紧和松手分别触发准备好的短音效,让玩家听见操作的结果。

用反向播放表达收回

发射分支使用 speed 2,收回分支使用 speed -2.。改变播放方向和速度,让射出与收回听起来不同。

声塔持续提示下一步

正常声塔保留较明亮、规律的脉冲;被蛛网包裹后,音色变暗并加入细微质感变化,同时保留方向提示所需的清晰度。

09 / Direction

左右听不清,就加一点提示。

远处声塔之间的夹角较小,左右方向不易分辨。独立的引导声源在需要选择方向时提供更明确的提示,并在玩家接近目标后逐渐与声塔汇合。

空间音频 / 方向引导用一个引导声源,把方向提示拉开
声塔玩家引导声源

01 / 问题

示意图:玩家与两侧声塔形成较小夹角

声塔离得远,左右方向不容易分清。

02 / 引入

示意图:独立引导声源位于玩家一侧

需要选边时,让引导声源出现。

03 / 移动

示意图:引导声源随玩家前进改变位置

玩家向前摆荡,引导位置跟着调整。

04 / 汇合

示意图:引导声源逐渐与声塔位置重合

快到目标时,引导声源与声塔汇合。

在需要选边的时候出声

引导声在选择左右的短暂窗口里播放,让玩家多一个方向线索,不必只靠远处声塔之间很小的角度差异。

跟着玩家移动,靠近声塔时汇合

引导声源的位置随玩家与声塔的距离关系连续变化。在接近、对齐或经过目标时,两者逐渐汇合,让方向提示自然衔接。

声源放哪儿,和怎么听出方位

Apple 的空间音频渲染接口与 HRTF 方案用于表现声源方位;游戏逻辑负责决定引导声源何时出现、放在哪里,以及怎样随玩家移动。

接口参考:Apple 空间音频渲染

图示呈现引导声源的位置关系。具体角度与过渡参数需结合设备和用户体验调整。

10 / Distance

快到了,声音会变。

离目标还有多远?是在靠近,还是已经荡过去了?音量、音色和细微的音高变化一起提供线索,让摆荡的过程也能被听见。

01

音量

距离增加时逐渐减弱,提供远近的基本线索。

02

音色

远处的声音减少高频,近处则更明亮。

03

运动

通过细微的音高变化提示接近与远离,参数平滑过渡。

远 · 轻、暗
近 · 清晰、明亮
空间音频 / 距离与运动用音量、音色和音高表现摆荡
声塔玩家引导声源

01 / 音量与音色

距离提示图,展示不同距离下的音量与低通变化

距离变化,同时改变音量和高频成分。

02 / 运动与音高

运动提示图,接近声源时音高升高,远离时音高降低

依据相对运动,加入细微的音高变化。

离得远,声音就轻一些

通过距离衰减,让较远的声源更轻;衰减方式需要与游戏尺度和背景声音一起调整。

远处暗一些,近处亮一些

远处声源减少高频,音色更暗。让距离不只依赖响度,也能通过音色变化被识别。

用音高变化提示运动方向

根据玩家与声源的相对速度,细微调整播放速率,以多普勒式变化辅助表达摆荡中的运动。

别让声音突然跳变

对音量和滤波参数做连续过渡,减少快速运动中突兀的声音变化。

图示说明距离与运动的声音映射,参数效果仍需通过听觉测试确认。

11 / System Integration

从身体动作到游戏回应。

传感器识别握持状态,固定在前臂上的手机追踪手臂朝向。Max/MSP 处理信号与声音,再将动作传给游戏,连接起瞄准、发射与摆荡的完整过程。

  1. 01身体动作
  2. 02MMG + 手臂姿态
  3. 03Max/MSP 处理
  4. 04游戏动作与声音
  5. 05玩家继续判断
01

姿态输入

手机固定于前臂,相对校准姿态追踪抬臂与方向变化。

02

动作条件

握持状态与手臂姿态共同决定发射时机。

03

系统整合

把传感器、Max/MSP 和游戏接通,让身体动作能及时得到回应。

系统实现 / 姿态与键盘桥接最后一步:让游戏收到动作
  1. 01MMG 判断握持状态
  2. 02手机提供手臂姿态
  3. 03Max 发送动作消息
  4. 04Node.js 桥接键盘事件
  5. 05游戏与声音反馈
Max 通过 node.script 分别调用键盘桥接脚本的连线
游戏输入桥接 / Max 程序
查看大图

用手机判断手臂朝向

手机固定在前臂上,通过 IMU 和基准姿态校准,计算抬臂与方向变化。姿态数据通过 UDP 以约 30 Hz 发送,再与 MMG 的握持判断配合。

让 Node.js 帮忙按键

Max 使用 node.script 运行本地脚本,将动作消息转成游戏可接收的键盘事件。右侧按钮分支发送 press_w,左侧按钮分支发送 press_q,两路消息分别交给对应脚本处理。

配置脚本运行环境

这版实现依赖 node-key-sender 及其 Java 运行环境来发送系统键盘事件。串口采集与游戏键盘输入分别处理,搭建时需要逐段检查。

对象说明:Node for Max

接收 Max 消息并调用 node-key-sender 的 JavaScript 脚本
键盘事件脚本 / Q 键处理
查看大图

约 30 Hz 是姿态数据发送频率;整体响应延迟与运行稳定性需另行测试。

12 / What Comes Next

玩起来之后,
还有什么能做?

SonicWEB 将肌肉信号、手臂动作和声音整合为一个可玩的原型。测试也显示,用户差异、佩戴位置和手臂运动都会影响信号,成为后续需要解决的问题。

这枚传感器,还能用来做什么?

如果它不只判断一次握紧,而是持续记录肌肉的变化呢?这就需要更稳定的定位和贴合方式,也要让不同时间的记录能够比较。后来的 MyoSense,沿着这个问题继续往下做。

研究依据与项目说明

项目使用 MMG、姿态追踪与空间声音探索体感游戏。现阶段主要成果是系统整合和交互原型,稳定性与跨用户体验仍需进一步验证。

麦克风式 MMG 传感器与声腔设计研究

肌肉声音与等长收缩关系研究

材料、尺寸与频段的描述基于项目中的试验观察,其适用范围仍需进一步测试。