Rebrand SonicForge Studio -> ScoreFX Studio: UI names, About logo, favicon + icons for all exe builds

This commit is contained in:
2026-08-24 19:28:22 +07:00
parent 2bcc8369a5
commit 5b747606c7
30 changed files with 31 additions and 24 deletions
+1 -1
View File
@@ -29,7 +29,7 @@ def _info_sub(fourcc, text):
def _bext(md, now):
fixed = bytearray(_BEXT_FIXED)
fixed[0:256] = _pad(md.get("description", ""), 256)
fixed[256:288] = _pad(md.get("originator", "SonicForgeStudio"), 32)
fixed[256:288] = _pad(md.get("originator", "ScoreFXStudio"), 32)
fixed[288:320] = _pad(md.get("originator_reference", ""), 32)
fixed[320:330] = _pad((md.get("date") or now.strftime("%Y-%m-%d")), 10)
fixed[330:338] = _pad((md.get("time") or now.strftime("%H:%M:%S")), 8)
+2 -2
View File
@@ -44,7 +44,7 @@ async def lifespan(app: FastAPI):
_SF_SCANNER_STOP.set()
app = FastAPI(title="SonicForge API Engine", lifespan=lifespan)
app = FastAPI(title="ScoreFX API Engine", lifespan=lifespan)
app.add_middleware(GZipMiddleware, minimum_size=500)
@@ -124,7 +124,7 @@ async def health():
async def get_index():
index_path = os.path.join(settings.TEMPLATES_DIR, "index.html")
if not os.path.exists(index_path):
return HTMLResponse(content=f"<h1>SonicForge Studio: index.html not found at {index_path}</h1>", status_code=404)
return HTMLResponse(content=f"<h1>ScoreFX Studio: index.html not found at {index_path}</h1>", status_code=404)
with open(index_path, "r", encoding="utf-8") as file:
resp = HTMLResponse(content=file.read(), status_code=200)
# no-cache: index.html PHẢI luôn mới (các bundle JS dùng ?v= để bust) —
Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

+5 -5
View File
@@ -8235,9 +8235,9 @@ const AboutModal = ({ isOpen, onClose }) => {
<div className="fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm" onClick={onClose}>
<div className="bg-[#1e1e24] border border-zinc-700 rounded-xl shadow-2xl w-full max-w-md p-6 text-slate-200" onClick={e => e.stopPropagation()}>
<div className="flex items-center gap-3 mb-4">
<img src="/favicon.svg" alt="SonicForge Studio" className="w-12 h-12 rounded-lg bg-zinc-900 border border-zinc-700 shadow-lg object-contain p-0.5" />
<img src="/static/img/scorefx_app.png" alt="ScoreFX Studio" className="w-12 h-12 rounded-lg bg-zinc-900 border border-zinc-700 shadow-lg object-contain p-0.5" />
<div>
<h2 className="text-lg font-bold text-white">SonicForge Studio</h2>
<h2 className="text-lg font-bold text-white">ScoreFX Studio</h2>
<p className="text-xs text-zinc-400">Professional DAW — v{APP_VERSION}</p>
</div>
</div>
@@ -8284,7 +8284,7 @@ const HelpModal = ({ isOpen, onClose, lang }) => {
<div className="fixed inset-0 z-[9999] flex items-center justify-center bg-black/70 backdrop-blur-sm" onClick={onClose}>
<div className="bg-[#1e1e24] border border-zinc-700 rounded-xl shadow-2xl w-full max-w-2xl max-h-[85vh] flex flex-col text-slate-200" onClick={e => e.stopPropagation()}>
<div className="flex items-center justify-between px-5 py-3 border-b border-zinc-800 shrink-0">
<h2 className="text-base font-bold text-white">{vi ? 'Hướng dẫn sử dụng SonicForge Studio' : 'SonicForge Studio User Guide'}</h2>
<h2 className="text-base font-bold text-white">{vi ? 'Hướng dẫn sử dụng ScoreFX Studio' : 'ScoreFX Studio User Guide'}</h2>
<button onClick={onClose} className="w-6 h-6 rounded hover:bg-zinc-700 text-zinc-400 hover:text-white text-sm">✕</button>
</div>
<div className="overflow-y-auto px-5 py-4 space-y-3">
@@ -28462,7 +28462,7 @@ const App = () => {
const handleSaveCloud = handleSaveProject;
const handleExportSFS = (customName = null) => {
const finalName = customName || projectName || 'Dự án SonicForge';
const finalName = customName || projectName || 'Dự án ScoreFX';
const projectSchemaObj = serializeProjectToSchema(currentProjectId || 'proj_' + Date.now(), finalName, bpm, tracks, subTabs, sessionTabs, masteringSettings, masterVolume, { volL: masterVolL, volR: masterVolR, link: masterLink, muted: masterMuted });
window.SonicStorage.exportProjectToSFS(projectSchemaObj);
showToast("Đã xuất dự án (.sfs) thành công!", "success");
@@ -31514,7 +31514,7 @@ STRICT CONSTRAINTS:
}, {
sep: true
}, {
label: 'About SonicForge Studio...',
label: 'About ScoreFX Studio...',
icon: 'info',
action: () => setAboutModalOpen(true)
}]
File diff suppressed because one or more lines are too long
+3 -3
View File
@@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>SonicForge Studio - Professional DAW Editor</title>
<title>ScoreFX Studio - Professional DAW Editor</title>
<script>
// ── Chặn BROWSER ZOOM toàn trang ──
// UI dùng px cố định cho item/button/label — browser zoom (Ctrl+wheel,
@@ -24,7 +24,7 @@
document.addEventListener('gesturestart', function (e) { e.preventDefault(); }, { passive: false });
document.addEventListener('gesturechange', function (e) { e.preventDefault(); }, { passive: false });
</script>
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="icon" type="image/png" href="/static/img/scorefx_favicon.png">
<!-- Bug #11: vendor local — trước đây load CDN (unpkg/cdn.tailwindcss/cdnjs) →
desktop Tauri offline trắng màn hình. Các file này nằm /static/vendor/. -->
<script src="/static/vendor/tailwindcdn.js"></script>
@@ -51,7 +51,7 @@
<script src="/static/js/services/promptTemplateManager.js?v=202607281039"></script>
<script src="/static/js/services/undoRedoEngine.js?v=202607290941"></script>
<script src="/static/js/services/chordTheory.js?v=202608211300"></script>
<script src="/static/js/app.precompiled.js?v=202608232200" defer></script>
<script src="/static/js/app.precompiled.js?v=202608241919" defer></script>
<link rel="stylesheet" href="/static/css/styles.css?v=202607271016">
<style>
:root {
+2 -2
View File
@@ -63,6 +63,6 @@ npx tauri build
Write-Host ""
Write-Host "== DONE =="
Write-Host " NSIS: src-tauri\target\release\bundle\nsis\SonicForgeDAW_1.0.0_x64-setup.exe"
Write-Host " MSI : src-tauri\target\release\bundle\msi\SonicForgeDAW_1.0.0_x64_en-US.msi"
Write-Host " NSIS: src-tauri\target\release\bundle\nsis\ScoreFXStudio_1.0.0_x64-setup.exe"
Write-Host " MSI : src-tauri\target\release\bundle\msi\ScoreFXStudio_1.0.0_x64_en-US.msi"
Write-Host " Verify after install: %APPDATA%\SonicForgeDAW\logs\spawn.log exists=True for daw_engine AND daw_vst_bridge"
+2 -2
View File
@@ -164,8 +164,8 @@ if ($doTauri) {
Write-Host ""
Write-Host "== DONE =="
Write-Host " NSIS: src-tauri\target\release\bundle\nsis\SonicForgeDAW_1.0.0_x64-setup.exe"
Write-Host " MSI : src-tauri\target\release\bundle\msi\SonicForgeDAW_1.0.0_x64_en-US.msi"
Write-Host " NSIS: src-tauri\target\release\bundle\nsis\ScoreFXStudio_1.0.0_x64-setup.exe"
Write-Host " MSI : src-tauri\target\release\bundle\msi\ScoreFXStudio_1.0.0_x64_en-US.msi"
Write-Host ""
Write-Host "== XAC MINH SAU KHI CAI DAT =="
Write-Host " Mo %APPDATA%\SonicForgeDAW\logs\spawn.log - phai thay [resource_dir/daw_engine (map layout)] ...exists=True"
+2 -2
View File
@@ -1,4 +1,4 @@
"""SonicForge DAW — Desktop engine launcher (PyInstaller entry point).
"""ScoreFX Studio — Desktop engine launcher (PyInstaller entry point).
Chay FastAPI backend duoi dang tien trinh nen (sidecar) cho ban cai Standalone
Windows (Tauri v2 shell). Tu chon port 8000-8010 (fallback neu bi chiem), tu
@@ -164,7 +164,7 @@ def main():
threading.Thread(target=_watchdog, daemon=True).start()
logger = logging.getLogger("desktop_engine")
logger.info("SonicForge engine listening on 0.0.0.0:%d", port)
logger.info("ScoreFX engine listening on 0.0.0.0:%d", port)
lan_ips = _lan_ips()
if lan_ips:
logger.info("LAN access — mo browser o may khac: %s",
+2 -2
View File
@@ -158,8 +158,8 @@ exe = EXE(
upx_exclude=[],
runtime_tmpdir=None,
console=False, # True khi debug (xem log truc tiep), False cho production
# Icon exe = favicon cua app (app/templates/favicon.svg -> render PNG -> ICO,
# sinh boi tools/gen_favicon_ico.py). Cung nguon voi icon hien thi trong app.
# Icon exe = favicon cua app (scorefx_favicon.png -> src-tauri/icons/favicon.ico,
# sinh bang PIL tu tools/gen_icons.py). Cung nguon voi icon hien thi trong app.
icon='src-tauri/icons/favicon.ico',
)
+6
View File
@@ -96,6 +96,8 @@ if(WIN32)
target_link_libraries(daw_vst_bridge PRIVATE ${FLUIDSYNTH_LIBRARY} ${SFIZZ_LIBRARY} JPEG::JPEG)
# Required Windows libs
target_link_libraries(daw_vst_bridge PRIVATE winmm imm32)
# App icon (shared favicon.ico -> exe resource)
target_sources(daw_vst_bridge PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/app.rc)
else()
target_link_libraries(daw_vst_bridge PRIVATE ${FLUIDSYNTH_LIBRARIES} ${SFIZZ_LIBRARIES})
endif()
@@ -124,6 +126,8 @@ endif()
target_link_libraries(fx_vst_bridge PRIVATE JPEG::JPEG)
# Required Windows libs
target_link_libraries(fx_vst_bridge PRIVATE winmm imm32 ws2_32)
# App icon (shared favicon.ico -> exe resource)
target_sources(fx_vst_bridge PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/app.rc)
endif()
# ── gui_probe: standalone VST3 GUI attach probe (debug tool, not shipped) ──
@@ -168,6 +172,8 @@ if(VST3_SDK_TARGET)
endif()
if(WIN32)
target_link_libraries(plugin_host PRIVATE ${FLUIDSYNTH_LIBRARY} ${SFIZZ_LIBRARY} winmm)
# App icon (shared favicon.ico -> exe resource)
target_sources(plugin_host PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/app.rc)
endif()
# G3.3: seh_channel_test — SEH per-channel crash isolation (debug tool, not shipped)
+1
View File
@@ -0,0 +1 @@
IDI_ICON1 ICON "app_icon.ico"
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 91 KiB

+1 -1
View File
@@ -303,7 +303,7 @@ pub fn run() {
// Builder-only API, so the main window is created here instead of
// tauri.conf.json (config-declared windows cannot disable it).
let _ = tauri::WebviewWindowBuilder::new(app, "main", tauri::WebviewUrl::default())
.title("Sonic Forge DAW - Professional Desktop Studio")
.title("ScoreFX Studio - Professional Desktop Studio")
.inner_size(1440.0, 900.0)
.resizable(true)
.devtools(true)
+1 -1
View File
@@ -1,6 +1,6 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "SonicForgeDAW",
"productName": "ScoreFXStudio",
"version": "1.0.0",
"identifier": "com.sonicforge.daw",
"build": {