2025/12/24

IDENTITY 不保證連續 以及 視窗函數(Window Functions)

 這篇 2017 年的筆記在核心觀念上非常正確,即便到了 2025 年,IDENTITY 不保證連續 以及 視窗函數(Window Functions)是解決此類問題的最佳解 這兩點依然是 SQL Server 的黃金準則。

不過,經過了 8 年的演進(SQL Server 2019, 2022 以及 Azure SQL 的普及),我們可以用更現代的視角來補充細節與最佳實踐。

以下是用 2025 年的技術狀態 對這篇筆記的重新解釋與建議:


1. 核心觀念驗證:為什麼 2025 年還是會有跳號?

筆記中提到「IDENTITY 保證唯一,不保證連續」,這點在 2025 年依然是鐵律。跳號的原因除了 2017 年提到的 交易退回 (Rollback) 之外,在現代雲端與高並發環境下,還有一個更常見的原因:

  • 快取 (Cache) 機制與伺服器重啟:

    現代版本的 SQL Server(尤其是 2012 之後及 Azure SQL Database),為了提升效能,預設會對 IDENTITY 進行快取(Cache)。如果伺服器意外重啟或服務切換(Failover),記憶體中未使用的號碼就會丟失。這導致你不只會看到跳 1、2 號,有時會看到跳 1000 號 或 10000 號 的斷層。

    • 2025 註解:這是為了高併發效能所做的權衡,通常被視為「特性」而非 Bug。

2. 效能評比更新:誰是冠軍?

2017 年的筆記比較了三種方法,結論是 LAG 函數成本最低 (18%)。

在 2025 年,這場比賽已經不用比了。

  • Self Join (自我連結):已被視為過時的寫法(Legacy pattern)。

  • OFFSET:雖然可用,但語法較冗長,可讀性不如視窗函數。

  • LAG / LEAD (視窗函數):依然是 絕對的霸主

現代 SQL Server 的優化器(Query Optimizer)對於視窗函數的優化已經非常成熟。使用 LAGLEAD 來解決「Gaps and Islands」(間隙與孤島)問題是標準的 Best Practice。

3. 2025 年的最佳實作程式碼 (Modern T-SQL)

原本 2017 年的 LAG 範例寫得不錯,但我們可以讓它更精簡且資訊更豐富(不僅找出哪裡跳號,還能算出跳了幾號,以及缺少的號碼範圍)。

推薦寫法:

SQL
-- 2025 Modern Approach
WITH GapAnalysis AS (
    SELECT 
        c1 AS CurrentID,
        -- LEAD 往後看一筆,直接與下一筆比較,比 LAG 往前看更直觀一點
        LEAD(c1) OVER (ORDER BY c1) AS NextID 
    FROM tblNum
)
SELECT 
    CurrentID + 1 AS GapStart,       -- 缺號開始
    NextID - 1 AS GapEnd,            -- 缺號結束
    (NextID - CurrentID) - 1 AS GapCount -- 缺了幾個號碼
FROM GapAnalysis
WHERE NextID - CurrentID > 1; -- 只要下一號減現在這號大於1,代表中間有洞

為什麼這個寫法更好?

  1. 使用 LEAD:邏輯上我們常想著「這一號跟下一號有沒有連著」,LEAD 語意上更符合直覺(當然用 LAG 效果完全一樣)。

  2. 明確指出缺口範圍:直接告訴你「缺了 6 到 7 號」,而不只是「5 號後面有斷掉」。

4. 架構層面的建議 (Architectural Advice in 2025)

如果你的業務需求非常在意「連續編號」(例如:統一發票、會計傳票),不要依賴 IDENTITY

在 2025 年的系統設計建議如下:

  1. 接受跳號 (Accept Gaps):

    對於訂單編號、會員 ID 等,跳號通常是可以接受的。為了追求連續號碼而犧牲資料庫的高併發寫入效能(需要 Table Lock)是不划算的。

  2. 如果必須連續,請自建序號表 (Custom Sequence Table):

    如果法律規定必須連續,請建立一張獨立的表格來管理序號,並在交易中使用 UPDLOCK 來確保取號。這會犧牲效能,但能保證連續。

  3. 考慮使用 SEQUENCE 物件:

    SQL Server 2012 引入了 CREATE SEQUENCE 物件。雖然它預設也有快取導致的跳號問題,但它提供了 NO CACHE 的選項(雖然會降低效能),且可以跨多張 Table 共用同一個序號池,比 IDENTITY 更有彈性。

總結

這篇 2017 的筆記結論在 2025 年依然正確

  • 結論:使用 視窗函數 (LAG / LEAD) 是尋找不連續資料的唯一正解。

  • 效能:依然是最高的。

  • 心態調整:除非是會計與法規需求,否則在雲端與微服務架構當道的今天,「視跳號為常態」 是更健康的系統設計思維。

2025/12/14

logseq/ obsidian改日期格式檔名

 沒錯,你的邏輯非常清晰且安全。這正是處理大量資料遷移的標準 SOP:

  1. 內容清洗 (Content Refactoring): 先把筆記內部所有的 [[December 15th, 2025]] 連結改成 [[2025-12-15]]。這時候檔案還沒改名,所以連結會暫時失效(沒關係)。

  2. 檔案重命名 (File Renaming): 把檔名改成 2025-12-15.md。這時候剛才改好的連結就會自動生效。

  3. 衝突防護 (Collision Guard): 如果 2025-12-15.md 已經存在,則跳過該檔案的改名,留給你之後用 Obsidian 的 Note Composer 手動合併。

我為你寫了一個 Python Script,具備了 Dry Run (模擬執行) 功能。預設是「只顯示不執行」,確認沒問題後你可以把開關打開。

Python 自動遷移腳本

請將以下程式碼存成 migrate_roam_dates.py,並放在你的 Logseq pages 或 journals 資料夾同一層目錄中(或者你需要修改 TARGET_DIR 路徑)。

Python
import os
import re
import sys

# ================= 設定區 =================

# 指定你的筆記資料夾路徑 (例如: r"C:\Users\Name\Logseq\pages")
# 如果腳本放在筆記資料夾內,使用 "." 即可
TARGET_DIR = r"." 

# 安全開關:True = 只顯示會發生什麼事,不實際修改檔案
# 確認無誤後,請改成 False
DRY_RUN = True 

# =========================================

# 月份對照表
MONTH_MAP = {
    "January": "01", "February": "02", "March": "03", "April": "04",
    "May": "05", "June": "06", "July": "07", "August": "08",
    "September": "09", "October": "10", "November": "11", "December": "12"
}

# Regex 模式:匹配 Roam 格式日期 (例如 December 1st, 2025)
# 捕捉組: Group 1=Month, Group 2=Day, Group 3=Year
DATE_PATTERN = re.compile(
    r'(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2})(?:st|nd|rd|th),\s+(\d{4})',
    re.IGNORECASE
)

def to_iso_format(match):
    """將匹配到的 Roam 日期轉換為 YYYY-MM-DD"""
    month_name = match.group(1).title() # 確保首字大寫以匹配字典
    day = int(match.group(2))
    year = match.group(3)
    
    month_num = MONTH_MAP.get(month_name)
    if not month_num:
        return match.group(0) # 找不到月份則不改
        
    return f"{year}-{month_num}-{day:02d}"

def process_files():
    print(f"🚀 開始執行... (Dry Run 模式: {DRY_RUN})")
    print(f"📂 目標資料夾: {os.path.abspath(TARGET_DIR)}\n")

    files = [f for f in os.listdir(TARGET_DIR) if f.endswith(".md")]
    
    # ---------------------------------------------------------
    # 第一階段:修改檔案內容 (Content Replacement)
    # ---------------------------------------------------------
    print("--- 階段 1: 修改檔案內容中的連結 ---")
    modified_count = 0
    
    for filename in files:
        file_path = os.path.join(TARGET_DIR, filename)
        
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                content = f.read()
            
            # 尋找 [[December 15th, 2025]] 這種格式
            # 我們使用回調函數 to_iso_format 來動態替換
            new_content = DATE_PATTERN.sub(to_iso_format, content)
            
            if content != new_content:
                print(f"[修改內容] {filename}")
                modified_count += 1
                
                if not DRY_RUN:
                    with open(file_path, 'w', encoding='utf-8') as f:
                        f.write(new_content)
                        
        except Exception as e:
            print(f"❌ 讀取錯誤 {filename}: {e}")

    print(f"第一階段完成:共計畫修改 {modified_count} 個檔案的內容。\n")

    # ---------------------------------------------------------
    # 第二階段:修改檔名 (Rename Files)
    # ---------------------------------------------------------
    print("--- 階段 2: 修改實體檔名 ---")
    rename_count = 0
    skip_count = 0
    
    # 重新掃描一次檔案列表,確保處理的是當前狀態
    files = [f for f in os.listdir(TARGET_DIR) if f.endswith(".md")]

    for filename in files:
        # 檢查檔名是否符合 Roam 格式 (去掉 .md 後檢查)
        name_without_ext = filename[:-3]
        match = DATE_PATTERN.fullmatch(name_without_ext)
        
        if match:
            new_name_body = to_iso_format(match)
            new_filename = f"{new_name_body}.md"
            
            old_path = os.path.join(TARGET_DIR, filename)
            new_path = os.path.join(TARGET_DIR, new_filename)
            
            # 檢查新檔名是否已經存在 (衝突檢查)
            if os.path.exists(new_path) and filename != new_filename:
                print(f"⚠️ [跳過 - 檔名衝突] {filename} -> {new_filename} (目標檔案已存在)")
                skip_count += 1
            else:
                print(f"✅ [改名] {filename} -> {new_filename}")
                rename_count += 1
                
                if not DRY_RUN:
                    try:
                        os.rename(old_path, new_path)
                    except Exception as e:
                        print(f"❌ 改名失敗: {e}")

    print(f"\n第二階段完成:")
    print(f"預計改名: {rename_count}")
    print(f"預計跳過 (衝突): {skip_count}")
    
    if DRY_RUN:
        print("\n✨ 這是模擬執行,沒有檔案被修改。")
        print("請將程式碼中的 DRY_RUN = False 改為 True 以執行實際操作。")
    else:
        print("\n🎉 作業完成!請記得使用 Obsidian Note Composer 處理那些「跳過」的重複檔案。")

if __name__ == "__main__":
    # 簡單防呆:確認路徑存在
    if os.path.exists(TARGET_DIR):
        process_files()
    else:
        print("❌ 找不到目標資料夾,請修改 TARGET_DIR 設定。")

如何使用此腳本

  1. 備份!備份!備份!

    在執行任何腳本前,請將你的整個 Logseq/Obsidian 資料夾複製一份到其他地方。

  2. 設定路徑:

    打開腳本,修改 TARGET_DIR。

    • 如果你把腳本直接丟進 pages 資料夾執行,保持 TARGET_DIR = "." 即可。

    • 否則請填入完整路徑,例如:TARGET_DIR = r"D:\MyNotes\pages" (注意前面的 r)。

  3. 執行 Dry Run (模擬):

    直接執行腳本:python migrate_roam_dates.py。

    它會列出所有它「打算」修改的內容和檔名。

    • 檢查 [修改內容] 是否正確抓到了日期。

    • 檢查 [改名] 轉換的 ISO 格式是否正確。

    • 檢查 [跳過 - 檔名衝突] 是否有正確偵測到重複檔案。

  4. 正式執行:

    將程式碼第 13 行改成 DRY_RUN = False。

    再次執行腳本。

  5. 善後處理:

    執行完畢後,打開 Obsidian,你會發現大部分檔案都已經變成標準的 2025-12-15.md。

    剩下的就是那些在 Console 中顯示 [跳過] 的檔案(即舊格式檔名),請使用 Obsidian 的 Note Composer 手動將它們合併到新的日期檔案中。

2025/12/04

最佳實踐:工作生活平衡 x 自我照顧 x 成長表現

 

⭐ 

最佳實踐:工作生活平衡 x 自我照顧 x 成長表現


👤 

給個人的最佳實踐(Best Practices for Individuals)


1. 建立「必要休息」觀念,而非「有空才休息」

  • 把休息視為維持表現的必需品,而不是罪惡或奢侈品。

  • 在行事曆中安排「不可移動的休息時段」。


2. 每天留 30–60 分鐘給自己


不必追求儀式感,只需固定時間做能補充能量的事:

  • 運動

  • 閱讀

  • 散步

  • 冥想

  • 單純發呆


這是「自我照顧」最基本也最有效的投資。


3. 留意「能量狀態」而非只看效率


問自己:

  • 今天我的心情是什麼?

  • 我現在是在「撐著」還是「運作著」?

  • 身體是否緊繃或疲憊?

    能量下降不代表你不努力,而是需要充電。


4. 練習健康的界線感(Boundaries)

  • 學會禮貌但堅定地拒絕不合理的工作量。

  • 設定「下班後不回應」的原則(或至少限縮範圍)。


界線不是冷漠,是保護你的專業與健康。


5. 把個人成長視為長期而非爆發式

  • 不以「短時間爆肝」換「表現」。

  • 以持續的小進步、長期輸出為核心。


🏢 

給管理階層的最佳實踐(Best Practices for Management)


1. 建立真正尊重下班時間的文化

  • 不鼓勵下班後的訊息與臨時需求。

  • 主管以身作則:不要在深夜傳工作訊息(即使說「不用回也可以」)。


文化由行為堆疊,而不是口號決定。


2. 用「可持續產能」評估表現,而非「工作時數」

  • 評價員工要看輸出成果與思考品質,而不是工時長短。

  • 避免美化過勞(hero culture)。


可持續的表現才是企業資本。


3. 定期與員工檢視工作負載(Workload Review)


每月或每季檢視:

  • 工作是否過量?

  • 是否明顯超出職務範圍?

  • 是否產生長期能量透支?


這比 OKR 更能反映真實健康程度。


4. 投資員工身心福祉(Well-being)

  • 提供心理諮商、冥想課程、運動補助

  • 定期 team day 或輕鬆聚會

  • 創造安全感強、互相支持的團隊氛圍


健康的員工才能創造健康的績效。


5. 以「人」為中心,而非軟體運算式管理

  • 面談時問「你最近還好嗎?」而不是只有問專案進度。

  • 鼓勵溝通、覺察與學習,而不是壓力傳遞鏈。


管理的是人,不是系統上的資源點。


🌟 

總結金句(可用於簡報/貼文)


個人的能量是績效的基礎;團隊的文化是能量的土壤。
照顧好人,績效自然會被照顧。

2025/12/03

為什麼你的筆記撐不了多久?——讓筆記真正「留得住」的大原則

https://www.youtube.com/watch?v=cCoaug12x8Y


為什麼你的筆記撐不了多久?——讓筆記真正「留得住」的大原則


不久前,我找到了一本自己很久以前寫的筆記本,裡面滿滿都是當時的想法與記錄。

但翻著翻著,我突然發現一件怪事:


很多筆記,我 看得懂字,卻完全看不懂在寫什麼


「記得打給 G」
「19.5 是最好的設定」
「今天真的很糟」


誰是 G?

要打給他幹嘛?

19.5 是哪裡的設定?

今天到底發生了什麼事?


那一刻,我感覺自己在讀別人的日記。


我是 Ryder,子彈筆記(Bullet Journal)方法的創辦人。這是一套幫助世界各地的人,用書寫打造更有意識生活的「人生作業系統」。

上一篇影片談的是如何讓你的「思考」更有未來性;這次,則是談:如何讓你的「筆記」在未來依然有用。


一、第一步:決定「你的筆記到底放哪裡」


不管你用紙本還是數位工具,要讓筆記有長期價值,第一件事是:

承諾一個「主要筆記容器」


如果沒有明確的依歸,我們很容易陷入一種狀況:


筆記長在各處:便利貼、各種筆記本、手機備忘錄、三個不同的筆記 App、公司筆記系統……


這種狀況叫做:筆記蔓延(note creep)


它帶來兩個問題:

  1. 小問題:每次都要重新決定寫在哪裡

    浪費心力與時間。

  2. 大問題:之後根本找不到當初寫下的重要內容

    這會讓你損失時間、金錢、機會,甚至好的點子就這樣消失。


解法:定義你的「單一真實來源」(Source of Truth)


也就是:所有筆記「一開始」都會出現的地方

  • 有人選擇 Obsidian、Notion 等 App

  • 對我來說,這個地方就是 子彈筆記本(Bullet Journal)


不論是工作還是生活,只要是筆記,一律先寫進同一個地方。


之後,你可以再把其中一部分轉移到其他系統,例如:

  • 把閱讀筆記整理進 Obsidian 作為長期知識庫

  • 或用數位工具管理大型專案


但好處是:

永遠知道「最初的筆記」在哪裡,因此不會迷路。


二、數位 vs 紙本:兩個關鍵問題——「會不會爛掉」和「到底是不是你的」


我個人用紙本,但這裡的思考也適用於數位筆記。


1. 數位筆記的兩大風險


(1)連結腐爛(Link Rot)

很多人喜歡在數位筆記裡塞滿連結,連到:

  • 文章

  • 資源

  • 網站

  • 雲端檔案


但研究顯示,幾年之後,這些連結有很大比例都會失效

曾經引用的內容,就這樣憑空消失。


這就是所謂的 link rot


(2)你不一定真正「擁有」你的筆記

如果你的筆記主要存在某個 App 裡,那麼:

  • 功能會隨著公司策略而改變

  • 更新可能會破壞你原本好不容易建立起來的系統

  • 最嚴重的是:

    • 公司被收購、關閉、轉型

    • 方案改價,你被迫付高價或被鎖在門外


有用戶曾遇過:

從每月 60 美元,突然變成 1000 美元,只為了繼續存取自己的資料。


當筆記容器不是你控制的,它就不是真正安全的。


2. 如何讓數位筆記比較「未來安全」?


可以注意兩件事:

  1. 使用開放格式

    • 例如:Markdown、純文字檔

  2. 檔案能存在你自己的設備上(本機或你控制的雲端)


如果你聽不懂技術細節,可以簡化成兩個問題:

  • 我可以 離線閱讀與編輯 這些筆記嗎?

  • 我可以用 其他程式打開這些筆記,而不會亂碼或失真 嗎?


只要有任何一題答案是「不行」,

那麼你對筆記的掌控權就不太夠。


3. 紙本筆記:回到你真正能掌握的東西


用筆記本的好處是:

  • 不會被關掉

  • 不會漲價

  • 不會更新壞掉


真正需要注意的是:品質

  • 太便宜的筆記本容易:

    • 裂膠、掉頁

    • 紙張太薄、滲墨

    • 長期保存後難以閱讀


我自己在設計官方子彈筆記本時,是找了一家做筆記本超過百年的公司合作——我本來就是他的愛用者,才成為合作方。


一本好筆記本,是你與自己對話的容器,不該是事後才被隨便想起來的產品。


三、第二步:給筆記一個「結構」,避免變成亂流


就算你已經決定好筆記要放哪裡,如果沒有系統,內容還是很容易變成:


一堆混在一起的:To-do、情緒、回憶、靈感、會議紀錄……


結果是:

  • 當下覺得有記下就好

  • 未來的自己完全不知道去哪找、怎麼用


這時,「子彈筆記方法」就能派上用場。


以下是 3 個讓筆記更有「未來可讀性」的核心設計:


1. 索引(Index):幫你的筆記本做「目錄」


索引的功能就像:

  • 書本的目錄

  • 檔案系統的地址簿


作用:

  • 快速找到你當初寫下某個主題的位置

  • 一眼看到:這本筆記本使用期間,你都在關注什麼議題


你也可以在數位系統裡實作類似概念,例如:

  • 標籤

  • 目錄頁

  • 主題頁索引


2. 收藏(Collections):同類的內容寫在一起


所謂 Collections,就是:


相關的內容集中在同一區域


例如:

  • 某個專案的所有構想與紀錄

  • 關於家人的回憶

  • 職涯反思

  • 諮商 / 治療筆記

  • 某本書的閱讀心得


只要「同一主題的東西寫在一起」,

你就自然替這些資料提供了 脈絡與意義,讓未來的自己一翻就懂。


3. 儀式(Rituals):定期整理,而不是只會「一直寫」


子彈筆記不只是一本筆記本,而是一套「反覆回看與整理」的流程。


透過定期的:

  • 日檢 / 週檢 / 月檢

  • 回顧與篩選

  • 把過時、沒意義的東西劃掉或移出


你會留下來的是:


一份「已經過濾過的自己」——
當時真正重要、在你生命中最有重量的部分。


這對未來的你來說,價值非常巨大。


四、最後一步:停止只為「現在的自己」寫筆記


這一點聽起來很怪,但非常關鍵:


不要再只為「現在」的自己寫筆記。


原因是:

  • 當我們為自己寫當下要看的筆記時

  • 我們會偷懶、寫很短

  • 很多內容是「默默假設自己記得背景」


但時間一久:

  • 你會忘記簡稱是誰

  • 忘了當時的情境

  • 忘了那句話背後的情緒與目的


例子:

  • 「打給 CS」

  • 「預約醫生」

  • 「晚餐超開心」


一週後、一年後再看,很可能完全沒有畫面。


解法:寫給「一個不認識你的人」看


想像你在替:

  • 一個 實習生

  • 一個 未來的你,但對你現在的生活一無所知的人


寫說明。


你自然會:

  • 多寫一點背景

  • 把人物、地點、目的寫清楚


例如:


原本:
「打給 CC 重新訂」

改成:
「打電話給 Catherine C.,請她幫忙去拿 Mark S. 在 2025/8/26 的生日蛋糕。」


只多寫一點點,就讓這條筆記在幾年後依然完全可懂。


五、用子彈筆記的「快速記錄」給內容加上結構


子彈筆記裡有一個技巧叫:快速記錄(Rapid Logging)


核心是:


把你的記錄拆成「一句一句的短句」,
並用符號標記類別。


四大類:

  1. 筆記(Note):事實、想法、觀察

  2. 行動(Action):要做的事

  3. 事件(Event):發生的事情

  4. 情緒 / 心情(Mood):你內在的狀態


例如,原本一句模糊的:


「RP 離開了,好難過。」


改成快速記錄版本:

  • 事件:今天是 Rosh P. 的最後一天。

  • 想法:這對我們來說很難,對她應該更難。

  • 心情:覺得難過,但也很感激她。

  • 行動:寄花和感謝卡給她。


短短四句,

就能讓一個完全不認識你的人,也理解你當時的處境與心情。


六、寫筆記真正的意義


我們之所以要寫下任何東西,是因為:


人腦並不擅長長期保存資訊——即使是重要的。


透過:

  • 統一筆記的容器

  • 選擇可控、長久的格式

  • 建立索引與主題集合

  • 用儀式定期回顧與汰除

  • 並用「寫給陌生人」的方式加上背景


你就不是只是在「堆筆記」,

而是在建立一份 終身可用的智慧存摺



2025/12/02

如何做出超狂 Sub Bass?Mr. Bill 分享的 Copycat 技巧解析

https://www.youtube.com/watch?v=rZ-XmTGaBso


如何做出超狂 Sub Bass?Mr. Bill 分享的 Copycat 技巧解析


大家好,我是 Mr. Bill。這次要分享一個是我從製作人 Copycat 那裡學來的做 Sub Bass 的超強技巧,讓你的低頻不再只是「一條正弦波」,而是更飽滿、更大聲、更有設計感的 Sub。


一、過去對 Sub Bass 的迷思:只用一條正弦波?


很長一段時間,我對 Sub Bass 的處理都非常「敷衍」:

  • 開一個 Operator,拉一條 正弦波(sine wave) 就算完事

  • 或者直接用 Ableton 內建的 Hip Hop Sub Bass 音色(很多人都愛用的那個 rack)


然後就不再多想。


直到有一天我問 Copycat:


「你的 Sub 聽起來怎麼這麼好?你到底怎麼做的?」


我原本以為他也只是用 sine wave,結果完全不是。他給了我一個 超聰明、但其實很好懂 的方法,這篇就是要把這個技巧拆給你看。


二、認識關鍵工具:Oscilloscope(示波器)


要理解這個技巧,先得認識一個工具:示波器(Oscilloscope)


我使用的是 M Oscilloscope(Melda 出品的免費插件),功能是:

  • 在 2D 圖上顯示:

    • X 軸:時間

    • Y 軸:振幅(音量)

  • 等於是「即時顯示波形」,不用每次 bounce 出來再看


為什麼這麼重要?因為:


人耳感受到的「大聲與否」,其實是「音量隨時間的表現」


不是只有「峰值」重要,而是「有多少時間維持在較高音量」。


三、實驗:為什麼感覺比較大聲,不一定是電平比較高?


影片中做了一個簡單的實驗:

  • A:短促但峰值接近 0 dB 的聲音

  • B:整體電平較低(約 -8 dB),但維持較久的聲音


結果是——B 聽起來反而比較大聲


原因在於:

人耳對「非常短的聲音」其實不太敏感,

但對「長時間維持較高音量」的聲音會覺得更吵、更飽滿。


結論:感覺大聲 = 振幅 × 時間。


四、把這個觀念用在 Sub Bass 上


1. 從一條簡單的正弦波開始


在 Operator 裡先做一條乾淨的 Sub:

  • 單一 oscillator

  • 正弦波

  • 接上 Oscilloscope 觀察波形


你會看到:

  • 波形的上半部 & 下半部是最大振幅的區域(最「響」的部分)

  • 中間穿過 0 的地方叫 zero crossing(零交叉) → 代表揚聲器回到中間,瞬間是「完全沒聲音」


也就是說,一條純正弦波:


大約只有 50% 的時間是在「大聲」區域,剩下 50% 是在中間、接近靜音。


2. 目標:讓 Sub「在更多時間裡」都維持在較高音量


我們要做的不是只是把音量整體拉高,而是:


讓 Sub 的波形有 更多區段維持在接近最大振幅
也就是在 Oscilloscope 上,有更多時間貼近上下界線。


這樣 Sub 聽起來就會:

  • 更飽滿

  • 更有存在感

  • 也更容易在小喇叭或手機上被「感受到」


五、用「加諧波 + 調相位」來塑形 Sub 波形


1. 添加諧波(Harmonics)


在 Operator 裡把 routing 改成:

  • 多個 oscillator 並聯輸出(不是互相調變的 FM 模式)

  • 例如:A + B 一起出來


然後:

  • A 保持在基頻(假設是 110 Hz)

  • B 用 Course 升到「第三諧波」

    • 如果基頻是 110 Hz

    • 第三諧波就是 330 Hz


這樣做的目的有兩個:

  1. 增加波形的複雜度,讓 Sub 在時間上「更多地方是響的」

  2. 在手機、小喇叭上保留可聽資訊

    • 很多設備播不出超低頻

    • 但如果有保留諧波,人耳會透過「心理聲學」去「補完」缺失的低頻


不過要注意:

  • 諧波加太多,波形有時反而會變得「平均音量變低」

  • 所以不是越多越好,而是要 用耳朵 + 示波器一起判斷


2. 調整 Phase(相位)來「排版」音量分布


這是 Copycat 提供的真正關鍵。


在 Operator 內,你可以調整 Oscillator 的 Phase(相位起始點)

這等於是在說:


「從這一個週期的第幾百分比開始播放?」


改變這個起始點,就會導致整個波形的形狀改變——

  • 有的排法會讓「大振幅區域」集中在某段時間

  • 有的則會讓整個週期裡「貼著最大值的時間變多」


透過不斷:

  1. 放音

  2. 看 Oscilloscope

  3. 調整 Phase & 諧波音量


你可以「雕刻出一條在時間上更長時間保持大音量的 Sub」,

也就更「肥」、「扎實」。


六、用示波器「抄」別人的 Sub 波形


Copycat 也教了另一個超實用的技巧:反向工程你喜歡的 808 / Sub


做法是:

  1. 找一條你超愛的 808 或 Sub(例如 Copycat 自己的 808)

  2. 用示波器觀察它的一個「完整週期」波形

  3. 在自己的合成器裡:

    • 加諧波

    • 調比例、Phase、失真量

    • 一邊看示波器,讓波形越來越接近那條參考 Sub


結果是:

  • 雖然你做的不是完全一模一樣

  • 但你已經抓到 相似的結構與形態

  • 而且還會是乾淨、可控的版本(沒有多餘噪音)


這是學習、練習 Sub 設計的一個超棒方法。


七、讓 Sub 更有 Punch:Pitch Envelope & 後期處理


除了波形本身,還可以加入以下細節:


1. Pitch Envelope(音高包絡)

  • 在 Sub 起音時加一個小小的「下滑音高」

  • 會讓 Sub 一開始聽起來更有 Punch,像 kick 的前緣


2. 後期處理(Post-Processing)


可以適量加入:

  • Distortion / Saturation(失真、飽和):讓高頻有一點「沙沙感」

  • Amp 模擬:多一層顆粒與色彩

  • Erosion 等特殊效果(但這類效果現在有點被用爛了,要小心別太過頭)

  • OTT:多頻段壓縮讓細節更浮現,但也會讓波形更往「方波/三角波」方向靠攏,要注意不要失去低頻的穩定性


這些都是在「原始波形」設計好之後的加分項目。


八、和預設音色比較:自製 Sub 的差距


最後,Mr. Bill 拿自己花幾分鐘做的 Sub,和 Ableton 內建的 Hip Hop Sub Bass 做比較。


主觀感受上:

  • 自製 Sub:

    • 更有存在感

    • 更有設計感與動態

  • 預設 Sub:

    • 雖然實用,但相對比較「扁平、無聊」


這也說明——


用一點時間設計自己的 Sub,回報其實非常高。


九、總結:記住這一句話


感受的大聲程度 = 振幅 × 時間。


這個概念不只適用在 Sub Bass,也可以用在:

  • Kick

  • Snare

  • 任何你想讓它「更大聲、更有存在感」的聲音


用 Oscilloscope 觀察「音量隨時間的變化」,

再透過 諧波、相位、失真與包絡 去塑形,

你的整首歌就能在不「亂推整體電平」的情況下,

變得更厚、更飽滿、更不「虛」。



用 Vision 4X 打造完美電子音樂混音

https://www.youtube.com/watch?v=PyxrP1s5JdY


如何用 Vision 4X 打造完美電子音樂混音?——重點解析


混音時,「電平監測(metering)」往往被認為是枯燥的主題,但它其實是提升作品品質的重要關鍵。與其盲目追逐炫目的新 VST,不如花點時間學會正確使用專業的監測工具。這次要介紹的,就是能大幅提升混音效率的 Vision 4X


為何會有 Vision 4X?


Vision 4X 的誕生源自製作團隊 Trio Noia 長年的需求。他們與許多製作人一樣,過去必須依靠不同的工具來檢測音訊——例如:

  • 使用 Specoscope 分析波形

  • 使用 Stereo Tool 查看向量儀

  • 用 Voxengo Span 觀察頻譜


其中有些插件是免費的,有些後來停止更新或不再可用。作者也曾轉向其他大型套件,如 Insight(偏向後期製作)、或 Wavelab(客製能力強,但使用上仍有些限制)。直到遇到 Vision 4X,他才發現這款工具「剛剛好」符合電子音樂的需求,尤其適合鼓打貝斯、EDM、Techno 等類型。


Vision 4X 的核心優勢


Vision 4X 提供四項即時視覺化分析工具:

  1. Spectrum Analyzer 頻譜分析器

  2. Spectrogram 聲音能量 X-ray 式顯示

  3. Waveform 波形視覺化

  4. Vectorscope 立體聲相位視覺化


這些工具可自由排列、調整大小,甚至旋轉,讓製作者能按照自己的工作習慣設定畫面。


此外,它還能做到大多數監測工具做不到的事情——與你的作品同步比較參考曲目,並針對不同曲風提供參考模板,協助調整混音方向。


用 Vision 4X 比較參考曲目:找出你的低頻問題


範例中,作者載入自己的作品,並與「House」參考曲風比較。結果立刻看到低頻能量過多。他使用均衡器(例如 PSP Neon)稍微降低低頻音量或調整特定頻率,便能快速把音色拉回正確範圍。


不同曲風的頻譜參考也各自不同,例如:

  • Rock:低頻較少,高頻也較柔和

  • EDM、Trap:低頻與 808 能量極高


Vision 4X 的視覺化讓這些差異一目了然。


與 DAW 進行時間同步:快速微調 Kick 或 Snare


Vision 4X 可與 DAW 同步時間軸(例如 1 bar)。

在調整鼓組時,如 Kick 的 decay,視覺化會立即反應音量與動態的變化,非常適合找出:

  • Kick 是否過長

  • 是否吃掉混音空間

  • 是否壓縮過重/過輕


甚至還能透過 MIDI 觸發同步視覺化,讓 Snare 或其他聲音永遠顯示在畫面開頭,便於觀察壓縮器前後差異。


大量預設與分析功能:混音、母帶通吃


Vision 4X 內建許多精準的分析預設,包括:

  • 低頻聚焦

  • Pre/Post 限幅器比較

  • 快速立體聲檢測

  • 詳細頻譜(可變換顏色風格)

  • 中/側(Mid/Side)分析

  • 人聲專用頻率壓縮視圖


這些功能不只適合母帶後期,在混音階段也非常實用。


結語


Vision 4X 是一套由懂電子音樂的音樂人所打造的工具,集成了多項過去需要使用多個插件才能達成的功能。對 EDM、Techno、DnB 等類型的製作者而言,它能極大提升混音效率與準確度。


如果你正在尋找一款能 精準視覺化音訊、比對參考曲目、同步 DAW 的分析工具,Vision 4X 非常值得一試。



Buy me a coffee