Skip to content

Sekinbg1/MIDI-Difficulty-Calculation

Repository files navigation

MIDI-Difficulty-Calculation

MIDI难度计算 (注:以下描述均由“通义灵码”自动生成)

  采用两种模式及方法计算MIDI难度:标准及仅基础模式;累加及平均方法。

一、概念说明  ※注意:以下描述中:同一时刻下,弹奏的所有音。即单音及和弦皆使用“音”表示;在和弦中的每一个音符均使用“音符”表示,作以区分   ●音:单音及和弦的总称   ●音符:单个音符   ●单音:由单个音符所构成的音   ●和弦:由多个音符所构成的音 (组合音)

二、难度计算方法 (包含两种计算模式及方法)  ※标准模式中,先均放大6倍计算,保证在计算单个音时,其“音数难度”及“跨度难度”始终为整数,不会导致后面的计算中,因除以3除不尽造成小数;这样计算后,十级曲目对应的三项难度便刚好均为60 (保证了一定的精度)  ➢基础难度 (演奏速度)   ●公式:6000÷时间间隔 (ms) (标准)      ※1000÷时间间隔 (ms) (仅基础)   ●基准:需要将100ms对应十级难度,故采用6000来除 (6倍放大)   ●原理:基于每两音之间的时间间隔计算,间隔越短 (速度越快),难度越大    ※考虑到人的极限反应时间约为0.1s,遂将100ms对应十级难度  ➢音数难度 (和弦复杂度)   ●公式:音数×12   ●基准:1个音符难度为2,5个音符难度为10 (原始难度)      ※1个音符难度为12,5个音符难度为60 (6倍放大)   ●原理:同时演奏的音符越多 (和弦越复杂),难度越大    ※1个音符为最简单;5个音符为最难,对应十级难度  ➢跨度难度 (手部伸展)   ●公式:跨度×5 (跨度=冠音序号-根音序号)   ●基准:1个半音难度为5/6,12个半音 (一个八度) 难度为10 (原始难度)      ※1个半音难度为5,12个半音 (一个八度) 难度为60 (6倍放大)   ●原理:和弦中从根音到冠音的跨度越大,手部伸展要求越大,难度越大    ※12个半音 (一个八度) 为最难,对应十级难度

三、单个音的难度计算规则  对于每个音,综合三部分计算难度:  ※由于单音不存在跨度,故其跨度难度恒为0

 对于首音及后续音分别计算:   ➢首音    ※第一个音的基础难度恒为0 (因为没有前一个音来计算时间间隔)    ●单音:音数难度 (恒为2,放大6倍后恒为12)    ●和弦     ○有跨度:(音数难度+跨度难度)÷2     ○无跨度:音数难度 (跟单音一样恒为2,放大6倍后恒为12;不过基本不会发生)

  ➢后续音    ●单音:(基础难度+音数难度)÷2    ●和弦     ○有跨度:(基础难度+音数难度+跨度难度)÷3     ○无跨度:(基础难度+音数难度)÷2 (跟单音一样;不过基本不会发生)

四、聚合策略  ➢通道内聚合   ●将通道内所有音的难度累加后除以音的总数   ●关键还原步骤:标准模式中,最终结果还需再除以6,还原缩放比,以对应0~10级难度的范畴

 ➢多音轨处理 (单通道包含多个有效音轨)   ●分别计算各音轨难度的总和及平均值

 ➢总体聚合   ●分别计算所有有效通道难度的总和及平均值   ●有效通道:至少包含一个音符

五、输出和等级划分  ➢输出内容   ●各通道详细难度信息 (按乐器分类显示)   ●MIDI总难度及平均难度   ●两种模式的结果对比

 ➢等级划分 (基于平均难度)   ●专业级:810分   ●高级:68分   ●中级:46分   ●初级:24分   ●入门级:0~2分

六、技术特点   ●6倍放大策略:标准模式中,所有中间计算都使用6倍放大,最后统一还原   ●有效数据判定:严格过滤空通道,避免无效数据干扰   ●时间基准:以100ms间隔对应十级难度为基准   ●时间精度:使用毫秒级时间计算   ●和弦识别:将起始时间相同的音符合并为和弦处理   ●智能音符分组:将音分划为单音/和弦   ●乐器识别:识别所有乐器

 ➢规范的核心原则   ●首音单独处理   ●有效数据判定   ●通道间采用累加及平均值   ●缩放比的正确还原   ●严格区分单音与和弦

 综合考虑演奏的技术要求 (速度、复杂度及手部跨度),且严格遵循方法规范中提到的“有效数据判定”、“6倍放大策略”、“首音特殊处理”等核心原则,确保了难度计算的准确性和可靠性,并能够相对准确地评估MIDI的真实演奏难度。

About

MIDI难度计算

Resources

Stars

Watchers

Forks

Packages