PiaRef代码库结构梳理
PiaRef是5704PIA_C_PDK附带的源码演示程序。
程序结构主要围绕MIDI处理、音序器(Sequencer)、硬件抽象层(HAL)及用户界面(UI)交互展开,核心模块包括音序器事件处理、硬件回调、MIDI引擎配置和数据存储。通过TRAE 对源程序进行扫描,给出以下关键模块的调用关系分析。
一、核心模块结构
1. 音序器基础模块(PiaUtil/UTIL_SeqBaseEvent.c
)
- 功能:处理音序器的节拍事件(
SeqBaseTick
)、通用事件(SeqBaseEvent
)及MIDI播放控制(MidiPlayer_Play
)。 - 关键依赖:
libSEQ.h
:提供SMF(标准MIDI文件)播放器接口(如_SMF_PlayStart
、_SMF_PlayTickParam
)。PiaUtilCore.h
:定义硬件消息类型(如HWM_MIDI
)和UI回调(UI_Callback
)。
- 全局状态:通过
pSmf
(SMF播放器指针)、SBE_CurBar
(当前小节)等变量维护播放状态。
2. 硬件抽象层(PiaRef/HW_5704PIA-DK.c
)
- 功能:实现硬件回调函数
HW_Callback
,处理MIDI输入/输出、数据存储(DataFlash)、音效控制(混响、合唱)等硬件相关操作。 - 关键依赖:
GM2Synth
:MIDI合成器库(如_GM2Synth_HandleMidiEvent
处理MIDI事件)。USB
:USB MIDI处理(如_USBMC_SendMidiEvent
发送USB MIDI消息)。ScanFx
:音效扫描库(如_ScanFx_RevLevel
调整混响等级)。
3. MIDI引擎配置(PiaUtil/MD_Engine.c
)
- 功能:管理MIDI区域(
ZONE
)的配置,支持序列化(Engine_Serialize
)以存储到数据闪存。 - 关键依赖:
SER_PackConfig
:序列化库,用于将配置数据打包为二进制格式。ZONE
结构体(MD_Engine.h
):定义区域参数(键范围、音色、音量等)。
4. UI交互(PiaRef/UI_PreDescPia.c
)
- 功能:提供UI回调接口(
PresetUiCall
),将参数更新(如NRPN消息)传递到UI层。 - 关键依赖:
UI_Callback
(通用UI回调函数,用于通知UI状态变化)。
二、核心调用关系
1. MIDI播放流程
MidiPlayer_Play (UTIL_SeqBaseEvent.c)→ _SMF_PlayStart (libSEQ) // 启动SMF播放→ _SMF_PlayPause (libSEQ) // 暂停播放(初始状态)→ SeqBaseTick (节拍事件处理)→ _SMF_PlayTickParam (libSEQ) // 驱动SMF时钟→ UI_Callback(UIM_BEAT_BAR) // 更新UI小节/节拍显示
2. MIDI事件处理流程
硬件接收MIDI数据(如USB或串口)→ HW_Callback(HWM_MIDI) (HW_5704PIA-DK.c)→ _GM2Synth_HandleMidiEvent (GM2Synth库) // 合成器处理事件(发声/参数调整)
3. MIDI消息发送流程
应用层触发发送(如UI操作)→ HW_Callback(HWM_SEND_MIDI) (HW_5704PIA-DK.c)→ _MIDI_SendEvent (串口MIDI发送) 或 _USBMC_SendMidiEvent (USB MIDI发送)
4. 配置存储流程
Engine_Serialize (MD_Engine.c)→ SER_PackConfig (序列化库) // 打包配置数据→ HW_Callback(HWM_DF_WRITE_PAGE) (HW_5704PIA-DK.c)→ _Sys_DfWriteBlock (DataFlash写入) // 持久化存储
5. UI状态同步
音序器状态变化(如小节更新)→ UI_Callback(UIM_BEAT_BAR) (UTIL_SeqBaseEvent.c)→ UI层处理(如更新LCD显示)
三、关键模块依赖图
libSEQ (SMF播放)↑
UTIL_SeqBaseEvent.c (音序器)↓
UI_Callback (UI交互)↓
HW_5704PIA-DK.c (硬件抽象)↓
GM2Synth (合成器) / USB (USB MIDI) / DataFlash (存储)
总结
程序以音序器(UTIL_SeqBaseEvent
)为核心,通过硬件抽象层(HW_5704PIA-DK
)与MIDI合成器、USB/串口通信、数据存储等硬件模块交互,最终通过UI回调(UI_Callback
)实现状态同步。各模块分工明确,依赖关系清晰,支持MIDI文件播放、实时事件处理、配置存储等核心功能。