[转]MIDI note/frequency conversion

博客给出了一段C语言代码,用于实现MIDI到频率的转换,函数名为MIDItoFreq,通过特定公式计算频率,还提供了代码来源及可用于核对的表格链接。
  [code]
 double MIDItoFreq(int keynum) {
        return 440.0 * Math.pow(2.0, ((double) keynum - 69.0) / 12.0);
    }
[/code]



source:
http://www.musicdsp.org/showone.php?id=125

“Here is some C code: double MIDItoFreq( char keynum ) { return 440.0 * pow( 2.0, ((double)keynum - 69.0) / 12.0 ); } you can double-check the table here: http://tomscarff.tripod.com/midi_analyser/midi_note_frequency.htm
<think>好的,用户的问题是关于如何配置虚拟通道进行A/D换,涉及ADCJnVCRj、GCTRL位、扫描组(SG0-SG4),以及结果存储到ADCJnDRj和ADCJnDIRj寄存器。我需要先理解这些寄存器的功能和它们之间的关系。 首先,虚拟通道在A/D换中的作用是什么?虚拟通道允许将多个物理输入通道通过软件配置映射到特定的逻辑通道,方便管理和扫描。这可能涉及到设置每个虚拟通道的参数,比如输入源、采样时间等。 接下来是ADCJnVCRj寄存器。通常,这类寄存器用于配置每个虚拟通道的参数,比如选择输入通道、设置采样时间或参考电压。用户需要知道如何为每个虚拟通道设置这些参数,可能需要不同的位域来控制不同的选项。 然后是GCTRL位,这可能是全局控制寄存器中的某些位,用来启用或配置整个ADC模块的工作模式,比如换模式(单次扫描还是连续扫描)、触发源选择、中断使能等。需要明确每个位的具体作用,例如是否启用扫描组,或者选择触发方式。 扫描组SG0-SG4的作用可能是将多个虚拟通道分组,以便按顺序进行换。每个扫描组可能包含一组虚拟通道的列表,当启动换时,ADC会按照扫描组的顺序依次换这些通道。需要解释如何配置扫描组,比如将哪些虚拟通道添加到哪个组中,以及如何设置组的优先级或触发条件。 关于结果存储,ADCJnDRj应该是数据寄存器,保存换后的数值。而ADCJnDIRj可能存储补充信息,比如通道编号、时间戳或状态标志。需要说明换结果是如何被写入这些寄存器的,是每个通道对应一个寄存器,还是按组存储,以及如何读取这些数据。 用户可能是在开发嵌入式系统,需要配置ADC模块进行多通道数据采集。他们可能已经了解基本概念,但需要具体的寄存器配置步骤和注意事项。可能遇到的问题是配置顺序错误,导致通道不工作,或者结果存储不正确。 需要检查是否有遗漏的步骤,比如时钟配置、中断处理,或者校准过程。另外,不同厂商的MCU寄存器名称可能不同,用户可能需要参考具体的数据手册,但这里给出通用的配置流程。 最后,补充信息寄存器的作用也很重要,比如错误检测、溢出标志等,用户可能需要这些信息来处理异常情况。</think>### 虚拟通道配置与A/D换结果存储 #### 1. 虚拟通道与寄存器配置 虚拟通道通过寄存器$ADCJnVCRj$(如$ADJ0VCR0$)配置,每个通道对应独立的寄存器,用于设置输入信号源、采样时间和参考电压。例如: $$ADCJ0VCR0 = (CHSEL << 8) | (SAMP_TIME << 4) | REFSEL$$ 其中$CHSEL$为物理通道编号,$SAMP_TIME$控制采样周期,$REFSEL$选择参考电压源[^1]。 #### 2. GCTRL全局控制寄存器 $GCTRL$包含关键控制位: - `SCANGROUP_EN`: 启用扫描组模式 - `TRIG_SRC`: 选择触发源(软件/外部信号) - `CONT_MODE`: 连续换使能 例如设置单次扫描模式: $$GCTRL = (0x1 << 3) | (EXT_TRIG << 1);$$ #### 3. 扫描组(SG0-SG4)配置 扫描组通过$SGkCR$寄存器定义通道序列: ```c // 将虚拟通道0,2,5加入SG0 SG0CR = (0 << 16) | (2 << 8) | 5; SG0LEN = 3; // 设置组长度 ``` 优先级由组编号决定,$SG0 > SG1 > SG2$。 #### 4. 结果存储机制 - **数据寄存器** $ADCJnDRj$:存储12/16位换结果,格式为: $$DATA = (RAW_VALUE << 4) | CHAN_ID$$ - **补充寄存器** $ADCJnDIRj$:包含时间戳(bit16-31)、溢出标志(bit1)和校验码(bit0) #### 5. 典型配置流程 1. 初始化$GCTRL$设置工作模式 2. 配置$ADCJnVCRj$定义虚拟通道参数 3. 建立扫描组映射关系 4. 启动换后通过DMA或中断读取$ADCJnDRj/ADCJnDIRj$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值