Minecraft Note

by Haz, visualizer

25 note nhạc của Note block trong Minecraft

1 downloads Download file, 3.9 KB
How it installs, its SHA-256 and its code

Click Apply: MusicBar downloads it, checks its SHA-256 and puts it on the taskbar, or just puts it on if it already has it. Needs MusicBar 1.8 or newer.

SHA-256 4c3bc7625d1f35465bbc7b99bc7dc8c4d6db94bc3649cb471871a30e291252a4

//! name: MC Note
//! author: Tên bạn
//! kind: visualizer
//! description: MC note - visualizer dùng đủ 25 nốt của Minecraft (F#3 đến F#5), nốt sáng phù hợp với giai điệu nhạc, không phụ thuộc độ cao trào

// 25 nốt, nốt thấp ở bên trái, nốt cao ở bên phải.
// Muốn dịch vùng phổ theo dõi thì sửa hai số 0.05 và 0.55 trong noteX.
float noteX(float i)
{
    return 0.05 + 0.55 * i / 24.0;
}

// Độ nổi bật của một nốt: đỉnh phổ so với hai bên, nên chỉ nốt đang ngân mới sáng
float tone(float i)
{
    float x = noteX(i);
    float d = 0.55 / 24.0 * 0.75;
    float centerValue = spectrum(x);
    float around = 0.5 * (spectrum(max(x - d, 0.0)) + spectrum(min(x + d, 1.0)));
    return saturate((centerValue - around) * 2.0 + centerValue * 0.3);
}

float4 main(float2 uv : TEXCOORD) : COLOR
{
    float noteCount = 25.0;

    // Nốt nổi nhất lúc này, dùng để cân lại: nhạc nhỏ hay to đều hiện nốt như nhau
    float best = 0.0;
    for (int k = 0; k < 25; k++)
    {
        float fk = k;
        best = max(best, tone(fk));
    }

    float column = min(floor(uv.x * noteCount), 24.0);
    float t = column / 24.0;
    float own = tone(column);

    // Chỉ sáng khi thật sự có nốt; không dùng level hay beat
    float gate = smoothstep(0.03, 0.10, best) * (0.4 + 0.6 * playing);
    float act = pow(saturate(own / max(best, 0.05)), 2.0) * gate;

    // Kích thước tính theo chiều cao thanh để nốt luôn nằm gọn trong taskbar
    float2 px = uv * size;
    float cellWidth = size.x / noteCount;
    float lx = px.x - (column + 0.5) * cellWidth;
    float hs = clamp(size.y * 0.14, 3.0, 7.0);            // nửa cạnh khối
    float headRad = clamp(size.y * 0.07, 2.0, 4.0);       // bán kính đầu nốt nhạc

    // Khối nằm ở nửa dưới thanh, nốt càng cao càng nhích lên nhẹ
    float cy = size.y * (0.74 - 0.14 * t);
    float ly = px.y - cy;

    // Màu cầu vồng theo cao độ, đậm và sáng để dễ thấy trên nền taskbar
    // Màu đậm, bão hòa nhưng hạ bớt độ sáng (0.82) và ít pha trắng để không chói mắt
    float3 hueColor = saturate(0.5 + 0.5 * cos(6.28318 * (t + float3(0.0, 0.333, 0.667))));
    float3 noteColor = lerp(hueColor, colorA.rgb, 0.1) * 0.82;
    float3 brightColor = lerp(noteColor, float3(1.0, 1.0, 1.0), 0.1);

    // Khối note block: luôn thấy mờ, sáng rõ và viền sáng khi nốt đang vang
    float2 q = abs(float2(lx, ly)) - hs;
    float boxDist = max(q.x, q.y);
    float block = 1.0 - smoothstep(-0.5, 0.8, boxDist);
    float rim = smoothstep(-2.2, -0.8, boxDist);
    float3 idleColor = lerp(colorB.rgb, noteColor, 0.7);
    float3 litColor = lerp(noteColor, brightColor, rim);
    float3 blockColor = lerp(idleColor, litColor, act);
    float blockAlpha = block * (0.4 + 0.45 * act);

    // Nốt nhạc nổi lên trên khối, kẹp lại để không bị cắt mất ở mép trên thanh
    float lift = act * size.y * 0.08;
    float py = cy - hs - headRad - 1.0 - lift;
    py = max(py, headRad * 3.0 + 1.0);
    float sway = sin(time * 3.0 + column) * 0.8;
    float headDist = length(float2((lx - sway) / 1.25, px.y - py));
    float head = 1.0 - smoothstep(headRad - 0.8, headRad, headDist);
    float stemX = headRad * 0.8;
    float stem = step(abs(lx - sway - stemX), 0.8)
               * step(py - headRad * 3.0, px.y) * step(px.y, py);
    float glyph = saturate(head + stem) * act * 0.9;
    float3 glyphColor = lerp(brightColor, colorC.rgb, 0.2);

    // Quầng sáng mềm quanh nốt đang vang
    float glow = exp(-length(float2(lx, ly)) / (hs * 1.8)) * act * 0.3;

    float total = blockAlpha + glyph + glow;
    float3 rgb = (blockColor * blockAlpha + glyphColor * glyph + noteColor * glow)
               / max(total, 0.001);

    return paint(rgb, saturate(total));
}