From bde973a3ecf4e4c0fad159d4d944cfc3a7a83ff2 Mon Sep 17 00:00:00 2001
From: madderscientist <liruigang20131115@126.com>
Date: Fri, 30 Aug 2024 00:12:51 +0800
Subject: [PATCH] =?UTF-8?q?=E5=87=8F=E5=B0=8FCQT=E9=A2=91=E8=B0=B1?=
 =?UTF-8?q?=E7=9A=84=E8=BE=B9=E7=BC=98=E6=95=88=E5=BA=94=E7=9A=84=E5=BD=B1?=
 =?UTF-8?q?=E5=93=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md | 4 ++--
 app.js    | 1 +
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 7948e92..ec028d6 100644
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@
 
 ## 导入导出说明
 - 导出进度: 结果是.nd的二进制文件,保存分析结果(频谱图)和音符音轨。导入的时候并不会强制要求匹配原曲!(会根据文件名判断一下,但不强制)
-- 导出为midi: 只保证能听,节拍默认4/4,bpm默认60,midi类型默认1(同步多音轨)。第10轨不会分配为鼓点轨(本项目设计并不考虑扒鼓)。
+- 导出为midi: 有两个模式。模式一只保证能听,节拍默认4/4,bpm默认60,midi类型默认1(同步多音轨);模式二会根据小节线进行对齐,可以直接用于制谱,算法概述见下面“节奏对齐”。两个模式下第10轨都不会分配为鼓点轨(本项目设计并不考虑扒鼓)。
 - 导入midi: 将midi音符导入,只保证音轨、音符、音色能对应,音量默认127。如果导入后没有超过总音轨数,会在后面增加;否则会覆盖后面几轨(有提示)。
 
 ## 常规操作
@@ -141,7 +141,7 @@
 
 ### 2024 8 2
 完成了issue2:不导入音频的midi编辑器。点击文件菜单下的“MIDI编辑器模式”就可以进入。<br>
-视野的宽度取决于最后一个音符,模仿的是https://signal.vercel.app/edit。也尝试过自动增加视野,可以一直往右拉,但是这样在播放的时候,开启“自动翻页”会永远停不下来(翻一页就自动拓展宽度)。<br>
+视野的宽度取决于最后一个音符,模仿的是[signal](https://signal.vercel.app/edit)。也尝试过自动增加视野,可以一直往右拉,但是这样在播放的时候,开启“自动翻页”会永远停不下来(翻一页就自动拓展宽度)。<br>
 扒谱框架下的midi编辑器还是有些反人类,因为绘制音符时的单位是时间而不是x分音符。不过也能用。<br>
 原理是实现了一个空壳的Audio,只有计时功能,没有发声功能。一些做法写在了todo.md上。
 
diff --git a/app.js b/app.js
index 45f1eaf..efd7f5b 100644
--- a/app.js
+++ b/app.js
@@ -1511,6 +1511,7 @@ function App() {
                                 const cqtBins = cqtData[i];
                                 const stftBins = s[i];
                                 for (let j = 0; j < cqtBins.length; j++) {
+                                    if(cqtBins[j] == 0) continue;   // 0的时候不用管,是低频的边缘效应
                                     // 用非线性混合,当两者极大的时候取最大值,否则相互压制
                                     if(stftBins[j] < cqtBins[j]) stftBins[j] = cqtBins[j];
                                     else stftBins[j] = Math.sqrt(stftBins[j] * cqtBins[j]);