MIDI键盘

简介

场景库实现midi琴功能:综合琴键消息并通过DSM单元播放,该库还包含琴键的拓展功能

  • 一键修改琴键音色

  • 支持打击乐

  • 支持琴键移调

  • 支持琴键颤音

  • 支持midi文件播放、伴奏和变速播放

  • 支持琴键录音、回放

  • 支持假弹功能

  • 支持音量控制

基本琴键

向midi综合器发送midi消息,以弹奏不同频率音调

函数使用

  • 调用player_midi_keyboard_init()函数后,在调用player_midi_keyboard_deinit()函数之前,可根据情况调用其它任意函数

int32_t player_midi_keyboard_init()

midi琴键初始化

返回

错误码

返回值
  • >0 – 初始化成功,返回目前剩余SRAM字节数

  • -1 – SRAM空间不足,初始化失败

Note

开始midi琴键功能,同时包含使能软件中断,注册软件中断和dma中断服务函数,搬运对应bss、data段数据,获取midi资源信息,并初始化midi综合器

Note

所有功能的使用都建立在琴键功能基础上,故此函数必须第一个调用,否则其它调用都无意义

int32_t player_midi_keyboard_deinit()

midi琴键去初始化

返回

错误码

返回值
  • 0 – 去初始化成功

  • -1 – midi综合器未初始化

Note

当不再需要琴键功能,通过此函数释放琴键功能占有的资源,包括DMA、DSM和SRAM。

Note

会将dsm关闭,dma中断和软件中断服务函数会修改原默认函数入口

int32_t player_send_midi_msg_note(int32_t note_val, int note_type)

琴键消息,发送琴键消息给综合器

参数
  • note_val – 琴键号,参数范围 0-127

  • note_type – 琴键状态, 1表示按下, 0表示松开

返回

错误码

返回值
  • 0 – 琴键消息发送成功

  • -1 – midi综合器未初始化

  • -2 – 琴键消息缓存溢出

Note

按照midi标准,琴键消息分为按下和抬起,琴键号支持0-127。另外琴键速度固定127,琴键消息通道固定通道15。

int32_t player_send_midi_msg_timbre(int32_t timbre_val)

琴键音色,发送修改琴键音色消息

参数
  • timber_val – 标准midi音色号

返回

错误码

返回值
  • 0 – 音色修改成功

  • -1 – midi综合器未初始化

  • -2 – 琴键消息缓存溢出

  • -3 – 资源文件没有对应音色

Note

音色的修改,需要资源库中包含的音色才可修改,否则修改失败,音色号使用标准midi音色号

int32_t player_send_midi_msg_modulation(uint8_t modulation_value)

琴键颤音,给琴键的声音添加颤音

参数
  • modulation_value – 颤音的程度,值越大程度越大,0表示不添加,参数范围 0-255

返回

错误码

返回值
  • 0 – 颤音添加成功

  • -1 – midi综合器未初始化

  • -2 – 琴键消息缓存溢出

int32_t player_send_midi_msg_pitch(uint8_t pitch_value_L, uint8_t pitch_value_H)

琴键移调,调整琴键整体声音频率偏移

参数
  • pitch_value_L – 频移的底七位

  • pitch_value_H – 频移的高七位

返回

错误码

返回值
  • 0 – 移调成功

  • -1 – midi综合器未初始化

  • -2 – 琴键消息缓存溢出

Note

pitch_value_H改变0x20即可实现相邻键变调

int32_t player_send_midi_msg_percussion(int32_t percussion_value, int32_t percussion_type)

打击乐,向midi发送打击乐消息

参数
  • percussion_value – 打击乐序号,从0开始

  • percussion_type – 按下或松开 按下为1,松开为0

返回

错误码

返回值
  • 0 – 打击乐信息发送成功

  • -1 – midi综合器未初始化

  • -2 – 琴键消息缓存溢出

Note

不同打击乐对应不同音色号,区分按下和松开。

Note

打击乐的音色号不是标准midi中的音色号,而是资源文件中的已有音色号,从0开始递增;另外打击乐固定使用通道9

void music_set_soundvolume(int8_t voice)

设置指定音量

参数
  • voice – 播放音量 ,范围0-16,值越大音量越大

返回

int32_t player_get_player_state(Midikeyboard_Player_Info_Struct *player_info)

获取琴键功能状态信息

返回

错误码

返回值
  • 0 – 获取状态成功

  • -1 – midi综合器未初始化

Note

详情结构体 Midikeyboard_Player_Info

使用

  1. 调用函数 player_midi_keyboard_init() 初始化

  2. 根据按键功能划分调用特定消息发送函数

  3. 根据情况调用 int32_t player_midi_keyboard_deinit() 去初始化

扩展功能

MIDI文件播放

将midi文件按功能分为伴奏midi和普通midi,伴奏midi一般无琴键演奏音色的声音,否则伴奏过程中,按键的琴键音很容易被掩盖。

函数使用

  • 调用player_midi_keyboard_init()函数后,在调用player_midi_keyboard_deinit()函数之前,可根据情况调用其它任意函数

  • 函数player_common_midi()、player_accompany_midi()、player_sham_midi()用于播放midi文件,player_comeoff_midifile()用于中止midi文件的播放

int32_t player_common_midi(int32_t file_id)

播放普通midi文件

参数
  • file_id – midi文件在普通midi文件的序号

返回

错误码

返回值
  • 0 – 播放文件成功

  • -1 – midi综合器未初始化

  • -2 – 没有该midi文件

Note

调用此函数后,即可播放指定midi文件,琴键仍可使用

Note

一首普通midi文件播放完毕后停止

int32_t player_accompany_midi(int32_t file_id)

播放伴奏midi文件

参数
  • file_id – midi文件在普通midi文件的序号

返回

错误码

返回值
  • 0 – 播放文件成功

  • -1 – midi综合器未初始化

  • -2 – 没有该midi文件

Note

调用此函数后,即可播放指定伴奏midi文件。琴键仍可用

Note

一首伴奏midi文件会重复播放,

int32_t player_sham_midi(int32_t file_id)

假弹奏,虚假按键演奏midi文件

参数
  • file_id – midi文件在普通midi文件的序号

返回

错误码

返回值
  • 0 – 播放文件成功

  • -1 – midi综合器未初始化

  • -2 – 没有该midi文件

Note

midi文件的播放,需要琴键有动作,midi文件的消息才会被综合器处理,而琴键对应的消息综合器不以理睬

int32_t player_comeoff_midifile()

中止播放,中止midi文件的播放

返回

错误码

返回值
  • 0 – 播放文件暂停

  • -1 – midi综合器未初始化

int32_t player_midifile_playspeed_increase()

改变midi文件播放速度

返回

错误码

返回值
  • 0 – 改变文件播放速度成功

  • -1 – midi综合器未初始化

Note

减小midi消息间的时间差,每次调用减少10ms

int32_t player_midifile_playspeed_decrease()

减慢midi文件播放速度

返回

错误码

返回值
  • 0 – 改变文件播放速度成功

  • -1 – midi综合器未初始化

Note

增加midi消息间的时间差,每次调用增加10ms

int32_t player_midifile_playspeed_reset();

midi文件的播放恢复到正常速度

返回

错误码

返回值
  • 0 – 改变文件播放速度成功

  • -1 – midi综合器未初始化

琴键录音

函数使用

  • 调用player_midi_keyboard_init()函数后,在调用player_midi_keyboard_deinit()函数之前,可根据情况调用其它任意函数

  • 录音文件的中止播放,也由 player_comeoff_midifile() 函数控制

int32_t player_midi_keyrecord_start(flash_init_area_functype flash_init_area_funcaddr, flash_save_data_functype flash_save_data_funcaddr, uint32_t flash_addr, uint32_t size_kbyte)

开始录音

参数
  • flash_init_area_funcaddr – flash区域擦除函数,函数类型flash_init_area_functype

  • flash_save_data_funcaddr – flash写函数,函数类型flash_save_data_functype

  • flash_addr – 使用的flash区域首地址

  • size_kbyte – 录按键消息的flash大小 in kbyte,只会取size_kbyte值中4kbyte的倍数

返回

错误码

返回值
  • 0 – 成功

  • -1 – midi综合器未初始化

  • -2 – flash大小不足4k

  • -3 – 未注册flash操作函数

  • -4 – flash操作失败

typedef int32_t (*flash_init_area_functype)(uint32_t addr, uint32_t size)

flash区域擦除函数

Param addr

写入flash首地址

Param size

使用flash区域大小 in byte

Returns

错误码

Retval 0

擦除成功

Retval 其它值

擦除失败

typedef int (*flash_save_data_functype)(uint32_t addr, uint8_t *pbuf, uint32_t len)

flash区域数据写入函数

Param addr

写入flash首地址

Param pbuf

待写入数据的首地址

Param len

待写入数据的长度 in byte

Returns

错误码

Retval 0

写入成功

Retval 其它值

写入失败

int32_t player_midi_keyrecord_done()

录音结束

返回

错误码

返回值

0 – 停止成功

Retvla -1

midi综合器未初始化

Note

按键消息记录完成,停止录音,并将缓存消息全部导入flash

int32_t player_midi_keyrecord_replay(uint32_t flash_addr)

录音回放

参数
  • flash_addr – 记录在flash的按键消息首地址

返回

错误码

返回值

0 – 回放成功

Retvla -1

midi综合器未初始化

Note

将录好的按键信息,回放