Rebrand SonicForge Studio -> ScoreFX Studio: UI names, About logo, favicon + icons for all exe builds
@@ -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)
|
||||
|
||||
@@ -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) —
|
||||
|
||||
|
After Width: | Height: | Size: 212 KiB |
|
After Width: | Height: | Size: 25 KiB |
@@ -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)
|
||||
}]
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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',
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
IDI_ICON1 ICON "app_icon.ico"
|
||||
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 212 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 91 KiB |
@@ -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,6 +1,6 @@
|
||||
{
|
||||
"$schema": "https://schema.tauri.app/config/2",
|
||||
"productName": "SonicForgeDAW",
|
||||
"productName": "ScoreFXStudio",
|
||||
"version": "1.0.0",
|
||||
"identifier": "com.sonicforge.daw",
|
||||
"build": {
|
||||
|
||||