📄 mmf2ma1.h
字号:
/*********************************************************************
Name: MMF2MA1.H
Purpose: Header for a converter to MMF Format to MA1
Programmer: Yuji Hisaminato
Date: 1999/12/13
Copyright (C) 1999 YAMAHA Corporation.
*********************************************************************/
#ifndef INCLUDED_MMF2MA1_H
#define INCLUDED_MMF2MA1_H
// C尵岅丄C++尵岅寭梡偵偡傞偨傔偺僩儕僢僋
// C++僐儞僷僀儔傪巊偄僋儔僗傪巊偆応崌偵偼儅僋儘mycplusplus傪掕媊偡傞丅
// C僐儞僷僀儔傪棙梡偡傞偲偒偵偼儅僋儘mycplusplus偼掕媊偟側偗傟偽傛偄丅
#ifdef mycplusplus
#define MMF2MA1_DECLARE_MEMBER
#endif
#if defined(mycplusplus)
#define MMF2MA1_CLASS Mmf2ma1
#define MMF2MA1_CLASS_CC Mmf2ma1::
#define MMF2MA1_STATIC
#else
#define MMF2MA1_CLASS
#define MMF2MA1_CLASS_CC
#define MMF2MA1_STATIC static
#endif
/* 俁僆僋僞乕僽傪挻偊傞壒晞偺張棟曽幃丅
0傑偨偼枹掕媊 -> 曄姺拞巭
1 -> 挻偊傞壒晞傪媥晞偵偡傞丅
僨僼僅儖僩偼侾丅
*/
#ifndef OCTAVE_RANGE_OVER_TYPE
#define OCTAVE_RANGE_OVER_TYPE 1
#endif
#include "machdep.h"
#include "conv_i.h"
#include "conv_o.h"
#define MMF_MAX_TRACKS 8 // 杮僾儘僌儔儉偱張棟偱偒傞嵟戝偺僩儔僢僋悢
#define MMF_MAX_CH_PER_TRACK 4 // 1僩儔僢僋偁偨傝偺嵟戝僠儍儞僱儖悢丅
#define MA1_MAX_PART 4 // MA1偱偺嵟戝僷乕僩悢亖係丅
#define MA1_MAX_VOICE 8 // MA1偱堦嬋偱棙梡偱偒傞嵟戝壒怓悢
#define INTERNAL_VOICE_PARA_NUM 13 // 撪晹偱偺壒怓僷儔儊乕僞悢亖俉亄俆
#define TOPLEVEL_CHUNK_ID "MMMD"
#define MIDI_FM_CHUNK_ID "MTR"
#define SEQUENCE_CHUNK_ID "Mtsq"
#define SETUP_CHUNK_ID "Mtsu"
#define SEEK_PHRASE_CHUNK_ID "MspI"
// Format Type
#define MMF_FORMAT_TYPE_HANDY_PHONE_STANDARD 0x00
#define MMF_FORMAT_TYPE_YMU757_NATIVE 0x80
// Sequence Type
#define MMF_SEQUENCE_TYPE_STREAM_SEQUENCE 0x00
#define MMF_SEQUENCE_TYPE_SUBSEQUENCE 0x01
// YAMAHA exclusive ID
#define MMF_EXCLUSIVE_ID_YAMAHA 0x43 // Exclusive Maker ID = YAMAHA
#define MMF_EXCLUSIVE_ID_FMM2 0x01 // Exclusive Format ID = FMM2
#define MMF_EXCLUSIVE_ID_MA1 0x02 // Exclusive Format ID = MA-1
#define MMF_USER_BANK 0x3f // user bank number
#define PHRASE_LIST_SIZE 58
// 張棟寢壥傪偁傜傢偡僐乕僪偺掕媊
typedef enum MMF2MA1_result{
// ToDo: 僄儔乕偺徻嵶偛偲偵僄儔乕柤傪梡堄偡傞丅晧側傜僄儔乕丅侽側傜惓忢丅惓側傜寈崘丅
MMF2MA1_E_CRC = -10,
MMF2MA1_E_EXCLUSIVE = -9,
MMF2MA1_E_NOTE_RANGE = -8,
MMF2MA1_E_TOTAL_SIZE = -7,
MMF2MA1_E_CHUNK_HEAD = -6,
MMF2MA1_E_TIMEBASE = -5,
MMF2MA1_E_FORMAT_TYPE = -4,
MMF2MA1_E_SEQUENCE_TYPE = -3,
MMF2MA1_E_GET_DATA = -2,
MMF2MA1_E_ERROR = -1,
MMF2MA1_R_SUCCESSFUL = 0,
MMF2MA1_W_NOTE_REMOVED_BY_RANGE = 1
}MMF2MA1_RESULT;
// 壒掱偺僔僼僩張棟偵娭偡傞儌乕僪偺掕媊
// 埲壓偺儌乕僪偺偆偪丄摉柺偼KEY_SHIFT_MODE_0偺傒傪僒億乕僩偡傞丅
typedef enum MMF2MA1_note_shift_mode{
MMF2MA1_NOTE_SHIFT_MODE_0, // MA-1偺壒堟奜偺偲偒偵偼曄姺偟側偄儌乕僪
MMF2MA1_NOTE_SHIFT_MODE_1, // MA-1偺壒堟奜偺偲偒偵偼丄僆僋僞乕僽僔僼僩偟偨壒怓傪梡堄偟偰僲乕僩傪僔僼僩偡傞丅
// 俉壒偱昞尰偱偒側偄偲偒偵偼曄姺偣偢偵廔椆偡傞丅
MMF2MA1_NOTE_SHIFT_MODE_2, // MA-1偺壒堟奜偺偲偒偵偼丄僆僋僞乕僽僔僼僩偟偨壒怓傪梡堄偟偰僲乕僩傪僔僼僩偡傞丅
// 俉壒偱拤幚偵昞尰偱偒側偄偲偒偱傕丄幚嵺偵弌傞壒偑僆僋僞乕僽偢傟傞偑偲偵偐偔偡傋偰曄姺偡傞儌乕僪丅
}MMF2MA1_NOTE_SHIFT_MODE;
typedef enum MMF2MA1_state{
MMF2MA1_STATE_INHIBIT, //僲乕僩僨乕僞偼愝掕偝傟偨偑丄傑偩張棟傪奐巒偟偰偼偄偗側偄忬懺
MMF2MA1_STATE_READY, //僲乕僩僨乕僞偼愝掕偝傟偨偄偰丄張棟偝傟偰偄側偄偑丄張棟傪奐巒偟偰傕傛偄忬懺
MMF2MA1_STATE_DIVIDED, //僲乕僩僨乕僞偼暘妱張棟偝傟偰偟傑偭偰偄傞丅偙偺忬懺偺偲偒偺ma1_start_pos_abs偼嵟屻偵暘妱偝傟偨埵抲傪偁傜傢偡丅
MMF2MA1_STATE_PROCESSED //僲乕僩僨乕僞偼偡傋偰張棟偝傟偨丅偙偺偲偒偺ma1_start_pos_abs,ma1_stop_pos_abs偼柍岠側僨乕僞丅
}MMF2MA1_STATE;
typedef struct MMF2MA1_internal_note{
MMF2MA1_STATE state; // 偙偺僲乕僩僨乕僞偺張棟僗僥乕僞僗丅徻嵶偼MMF2MA1_STATE偺愰尵晹傪嶲徠丅
UINT32 ma1_start_pos_abs;// 敪壒奐巒偺愨懳埵抲丅係僶僀僩傪巊偭偰偄傞偑丄彨棃偼僨乕僞峔憿偺岺晇偵傛傝僒僀僘傪尭傜偡偙偲傪専摙拞丅
// 偨偩偟state==MMF2MA1_STATE_DIVIDED偺応崌偵偼丄偙偺抣偼堦斣嵟屻偺暘妱埵抲傪偁傜傢偡丅
UINT32 ma1_stop_pos_abs; // 敪壒廔椆偺愨懳埵抲丅侾偮偺僀儀儞僩偱昞尰偱偒側偐偭偨挿偄壒偱偼丄
// 俀斣栚偺僀儀儞僩偑尰傟偨偲偒偵偙偺抣偼曄峏偝傟傞丅
UINT32 ma1_next_pos_abs; // 師偺僀儀儞僩偺奐巒帪崗
UINT32 ma1_gate_pos_abs; // 壖偵弌椡偟偨壒晞偺掆巭帪崗
UINT8 ma1_key; // MA1偺壒晞僨乕僞偺傾僪儗僗3N+0偵擖傞僶僀僩偺宍幃丄MA-1偺妝晥僨乕僞偺忋埵俉價僢僩
UINT8 ma1_vibrato; // vibrato: 0 -> OFF, 1 -> ON
}MMF2MA1_INTERNAL_NOTE;
typedef struct MMF2MA1_input_note{
UINT8 part; // MA1 part number
UINT8 key; // 撪晹昞尰偱偺壒掱
UINT32 pos_abs; // 愨懳奐巒埵抲[僗僥僢僾]
UINT32 gatetime; // 帩懕帪娫[僗僥僢僾]
}MMF2MA1_INPUT_NOTE;
typedef struct MMF2MA1_ti_tk_data{
UINT8 ti;
UINT8 tk;
UINT8 state;
}MMF2MA1_TI_TK_DATA;
// MMF僼僅乕儅僢僩偺僨乕僞傪count僶僀僩撉傒崬傓娭悢偺僾儘僩僞僀僾
typedef bool (*MMF_GET_DATA)(UINT8 *pbyte,UINT32 count,UINT32 *read_count);
// MMF僼僅乕儅僢僩偺僨乕僞偺撉傒崬傒埵抲傪愭摢偵堏摦偡傞娭悢偺僾儘僩僞僀僾
typedef bool (*MMF_REWIND)(void);
// MA1僼僅乕儅僢僩偺僨乕僞傪count僶僀僩弌椡偡傞娭悢偺僾儘僩僞僀僾
typedef bool (*MA1_PUT_DATA)(UINT8 *pbyte, UINT32 count);
#define MAX_OUTPUT_COUNT (512) //MA1_PUT_DATA偺count偺嵟戝抣
#ifndef NO_MA1_EXCLUSIVE
// Structure to store MA-1 Exclusive Data
typedef struct ma1_exclusive_data{
// voice parameters
bool is_voice_set[MA1_MAX_VOICE];
UINT8 voice_para[MA1_MAX_VOICE][INTERNAL_VOICE_PARA_NUM]; // voice parameter
UINT8 voice_para_bank[MA1_MAX_VOICE];
UINT8 voice_para_program[MA1_MAX_VOICE];
// tempo
bool is_tempo_defined;
UINT8 tempo;
}MA1_EXCLUSIVE_DATA;
#endif
typedef struct play_pos_info{
bool is_start_defined; // 奐巒埵抲偑掕媊偝傟偰偄傟偽true
bool is_stop_defined; // 廔椆埵抲偑掕媊偝傟偰偄傟偽true
UINT32 start_byte; // 擖椡僨乕僞偱偺奐巒埵抲
UINT32 stop_byte; // 擖椡僨乕僞偱偺廔椆埵抲
}PLAY_POS_INFO;
typedef struct play_pos_info_time{
UINT8 track; // 奐巒埵抲丄廔椆埵抲偺彂偐傟偰偄傞僩儔僢僋
bool is_start_defined; // 奐巒埵抲偑掕媊偝傟偰偄傟偽true
bool is_stop_defined; // 廔椆埵抲偑掕媊偝傟偰偄傟偽true
bool is_start_time_defined; // start_time=奐巒埵抲偑掕媊偝傟偰偄傟偽true
bool is_stop_time_defined; // stop_time =廔椆埵抲偑掕媊偝傟偰偄傟偽true
UINT32 start_byte; // 擖椡僨乕僞偱偺奐巒埵抲[僶僀僩]
UINT32 start_time; // 幚帪娫偱偺奐巒帪崗
UINT32 stop_byte; // 擖椡僨乕僞偱偺廔椆埵抲[僶僀僩]
UINT32 stop_time; // 幚帪娫偱偺廔椆埵抲
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -