Jelajahi Sumber

Merge branch 'mpckit-casing' of bajdev/mpckit into main

bajdev 1 hari lalu
induk
melakukan
e32802a25b

+ 10 - 8
README.md

@@ -1,8 +1,8 @@
-# mpckit
+# MPCkit
 
 Application to create basic MPC Sample starter projects from your desktop.
 
-**v0.5.0 is a beta for testing.** Expect rough edges, and keep copies of projects you care about.
+**The 0.5 releases are betas for testing.** Expect rough edges, and keep copies of projects you care about.
 
 ## What it does
 
@@ -13,15 +13,15 @@ Application to create basic MPC Sample starter projects from your desktop.
 
 ## Install
 
-Builds are not signed yet, so each system warns the first time you open mpckit.
+Builds are not signed yet, so each system warns the first time you open MPCkit.
 
-- **Windows 10 and 11:** run `mpckit.exe`. If SmartScreen says "Windows protected your PC", choose **More info**, then **Run anyway**. mpckit uses the WebView2 runtime, which is part of Windows 11 and current Windows 10.
-- **macOS:** move `mpckit.app` to Applications and open it. macOS will say it can't check the app for malicious software. Open **System Settings → Privacy & Security**, scroll to the message about mpckit and choose **Open Anyway**, then confirm.
+- **Windows 10 and 11:** run `mpckit.exe`. If SmartScreen says "Windows protected your PC", choose **More info**, then **Run anyway**. MPCkit uses the WebView2 runtime, which is part of Windows 11 and current Windows 10.
+- **macOS:** move `mpckit.app` to Applications and open it. macOS will say it can't check the app for malicious software. Open **System Settings → Privacy & Security**, scroll to the message about MPCkit and choose **Open Anyway**, then confirm.
 - **Linux:** make the file executable (`chmod +x mpckit`) and run it. It needs the GTK 4 and WebKitGTK 6.0 libraries, which current desktop distributions include or offer in their package manager.
 
 ## Development
 
-mpckit is a [Wails v3](https://v3.wails.io) app: Go for all file work, Svelte + TypeScript for the window.
+MPCkit is a [Wails v3](https://v3.wails.io) app: Go for all file work, Svelte + TypeScript for the window.
 
 You need:
 
@@ -40,7 +40,9 @@ wails3 build       # builds bin/mpckit (bin\mpckit.exe on Windows)
 
 The first run installs the frontend packages and generates `frontend/bindings` from the Go service.
 
-`wails3 build` stamps the version (`APP_VERSION` in `Taskfile.yml`, kept in step with `version` in `build/config.yml`) and the commit it was built from, so About shows "Version 0.5.0" and "Build 2354f57" ("-dirty" if there were uncommitted changes). `wails3 dev` shows "dev".
+`wails3 build` stamps the version (`APP_VERSION` in `Taskfile.yml`, kept in step with `version` in `build/config.yml`) and the commit it was built from, so About shows, for example, "Version 0.5.1" and "Build 2354f57" ("-dirty" if there were uncommitted changes). `wails3 dev` shows "dev".
+
+Releasing a new version: set it in `APP_VERSION` (`Taskfile.yml`), `version` in `build/config.yml`, `build/windows/info.json` (four places), `build/windows/wails.exe.manifest`, `build/windows/nsis/wails_tools.nsh`, `build/darwin/Info.plist` and `Info.dev.plist` (two places each) and `build/linux/nfpm/nfpm.yaml`. After the merge, tag the merge commit `v<version>`.
 
 The app icon is drawn by `go run ./tools/icon build/appicon.png`. The Windows and macOS icon files are generated from that PNG during the build.
 
@@ -50,7 +52,7 @@ Tests: `go test ./...`. On Linux without the GTK packages, use `CGO_ENABLED=0 go
 
 ## Disclaimer
 
-mpckit is an independent project. It is not affiliated with, endorsed by or supported by Akai Professional or inMusic Brands. Akai, MPC and MPC Sample are trademarks of their respective owners and are used here only to describe the device mpckit works with.
+MPCkit is an independent project. It is not affiliated with, endorsed by or supported by Akai Professional or inMusic Brands. Akai, MPC and MPC Sample are trademarks of their respective owners and are used here only to describe the device MPCkit works with.
 
 ## Licence
 

+ 3 - 2
Taskfile.yml

@@ -1,11 +1,12 @@
 version: '3'
 
 vars:
-  APP_NAME: "mpckit"
+  APP_NAME: "mpckit"         # file names: bin/mpckit, mpckit.exe, mpckit.app
+  PRODUCT_NAME: "MPCkit"     # the name people see, e.g. in the Linux menu
   # Shown in the About dialog of production builds: the version, and the
   # commit it was built from ("-dirty" if there were uncommitted changes).
   # Keep APP_VERSION in step with `version` in build/config.yml.
-  APP_VERSION: "0.5.0"
+  APP_VERSION: "0.5.1"
   COMMIT:
     sh: git describe --always --dirty --exclude "*" 2>/dev/null || echo unknown
   BIN_DIR: "bin"

+ 3 - 3
build/config.yml

@@ -6,12 +6,12 @@ version: '3'
 # This information is used to generate the build assets.
 info:
   companyName: "bajdev" # The name of the company
-  productName: "mpckit" # The name of the application
+  productName: "MPCkit" # The name of the application
   productIdentifier: "com.monoexp.mpckit" # The unique product identifier
   description: "Desktop kit editor for the MPC Sample" # The application description
   copyright: "(c) 2026 bajdev" # Copyright text
   comments: "Not affiliated with Akai Professional" # Comments
-  version: "0.5.0" # The application version
+  version: "0.5.1" # The application version
   # cfBundleIconName: "appicon" # The macOS icon name in Assets.car icon bundles (optional)
   #                               # Should match the name of your .icon file without the extension
   #                               # If not set and Assets.car exists, defaults to "appicon"
@@ -24,7 +24,7 @@ info:
 #   # The display name shown under the app icon (CFBundleDisplayName/CFBundleName)
 #   displayName: "My Product"
 #   # The app version to embed in Info.plist (CFBundleShortVersionString/CFBundleVersion)
-#   version: "0.5.0"
+#   version: "0.5.1"
 #   # The company/organisation name for templates and project settings
 #   company: "My Company"
 #   # Additional comments to embed in Info.plist metadata

+ 3 - 3
build/darwin/Info.dev.plist

@@ -13,13 +13,13 @@
 		<key>CFBundleIdentifier</key>
 		<string>com.monoexp.mpckit</string>
 		<key>CFBundleName</key>
-		<string>mpckit</string>
+		<string>MPCkit</string>
 		<key>CFBundlePackageType</key>
 		<string>APPL</string>
 		<key>CFBundleShortVersionString</key>
-		<string>0.5.0</string>
+		<string>0.5.1</string>
 		<key>CFBundleVersion</key>
-		<string>0.5.0</string>
+		<string>0.5.1</string>
 		<key>LSMinimumSystemVersion</key>
 		<string>12.0.0</string>
 		<key>NSAppTransportSecurity</key>

+ 3 - 3
build/darwin/Info.plist

@@ -13,13 +13,13 @@
 		<key>CFBundleIdentifier</key>
 		<string>com.monoexp.mpckit</string>
 		<key>CFBundleName</key>
-		<string>mpckit</string>
+		<string>MPCkit</string>
 		<key>CFBundlePackageType</key>
 		<string>APPL</string>
 		<key>CFBundleShortVersionString</key>
-		<string>0.5.0</string>
+		<string>0.5.1</string>
 		<key>CFBundleVersion</key>
-		<string>0.5.0</string>
+		<string>0.5.1</string>
 		<key>LSMinimumSystemVersion</key>
 		<string>12.0.0</string>
 		<key>NSHighResolutionCapable</key>

+ 1 - 1
build/linux/Taskfile.yml

@@ -170,7 +170,7 @@ tasks:
     dir: build
     cmds:
       - mkdir -p {{.ROOT_DIR}}/build/linux/appimage
-      - wails3 generate .desktop -name "{{.APP_NAME}}" -exec "{{.EXEC}}" -icon "{{.ICON}}" -outputfile "{{.ROOT_DIR}}/build/linux/{{.APP_NAME}}.desktop" -categories "{{.CATEGORIES}}"
+      - wails3 generate .desktop -name "{{.PRODUCT_NAME}}" -exec "{{.EXEC}}" -icon "{{.ICON}}" -outputfile "{{.ROOT_DIR}}/build/linux/{{.APP_NAME}}.desktop" -categories "{{.CATEGORIES}}"
     vars:
       APP_NAME: '{{.APP_NAME}}'
       EXEC: '{{.APP_NAME}}'

+ 1 - 1
build/linux/nfpm/nfpm.yaml

@@ -6,7 +6,7 @@
 name: "mpckit"
 arch: ${GOARCH}
 platform: "linux"
-version: "0.5.0"
+version: "0.5.1"
 section: "default"
 priority: "extra"
 maintainer: ${GIT_COMMITTER_NAME} <${GIT_COMMITTER_EMAIL}>

+ 5 - 5
build/windows/info.json

@@ -1,16 +1,16 @@
 {
 	"fixed": {
-		"file_version": "0.5.0",
-		"product_version": "0.5.0"
+		"file_version": "0.5.1",
+		"product_version": "0.5.1"
 	},
 	"info": {
 		"0409": {
-			"FileVersion": "0.5.0",
-			"ProductVersion": "0.5.0",
+			"FileVersion": "0.5.1",
+			"ProductVersion": "0.5.1",
 			"CompanyName": "bajdev",
 			"FileDescription": "Desktop kit editor for the MPC Sample",
 			"LegalCopyright": "(c) 2026 bajdev",
-			"ProductName": "mpckit",
+			"ProductName": "MPCkit",
 			"Comments": "Not affiliated with Akai Professional"
 		}
 	}

+ 6 - 6
build/windows/msix/app_manifest.xml

@@ -8,15 +8,15 @@
   IgnorableNamespaces="uap3">
   
   <Identity 
-    Name="com.example.mpckit"
+    Name="com.monoexp.mpckit"
     Publisher="CN=bajdev"
     Version="0.1.0.0"
     ProcessorArchitecture="x64" />
   
   <Properties>
-    <DisplayName>mpckit</DisplayName>
+    <DisplayName>MPCkit</DisplayName>
     <PublisherDisplayName>bajdev</PublisherDisplayName>
-    <Description>A mpckit application</Description>
+    <Description>MPCkit, a kit editor for the MPC Sample</Description>
     <Logo>Assets\StoreLogo.png</Logo>
   </Properties>
   
@@ -29,10 +29,10 @@
   </Resources>
   
   <Applications>
-    <Application Id="com.example.mpckit" Executable="mpckit" EntryPoint="Windows.FullTrustApplication">
+    <Application Id="com.monoexp.mpckit" Executable="mpckit" EntryPoint="Windows.FullTrustApplication">
       <uap:VisualElements
-        DisplayName="mpckit"
-        Description="A mpckit application"
+        DisplayName="MPCkit"
+        Description="MPCkit, a kit editor for the MPC Sample"
         BackgroundColor="transparent"
         Square150x150Logo="Assets\Square150x150Logo.png"
         Square44x44Logo="Assets\Square44x44Logo.png">

+ 8 - 8
build/windows/msix/template.xml

@@ -10,24 +10,24 @@
     <Installer
         Path="mpckit"
         Arguments=""
-        InstallLocation="C:\Program Files\mpckit">
+        InstallLocation="C:\Program Files\MPCkit">
     </Installer>
     <PackageInformation
         PackageName="mpckit"
-        PackageDisplayName="mpckit"
+        PackageDisplayName="MPCkit"
         PublisherName="CN=bajdev"
         PublisherDisplayName="bajdev"
         Version="0.1.0.0"
-        PackageDescription="A mpckit application">
+        PackageDescription="MPCkit, a kit editor for the MPC Sample">
         <Capabilities>
             <Capability Name="runFullTrust" />
             
         </Capabilities>
         <Applications>
             <Application
-                Id="com.example.mpckit"
-                Description="A mpckit application"
-                DisplayName="mpckit"
+                Id="com.monoexp.mpckit"
+                Description="MPCkit, a kit editor for the MPC Sample"
+                DisplayName="MPCkit"
                 ExecutableName="mpckit"
                 EntryPoint="Windows.FullTrustApplication">
                 
@@ -41,9 +41,9 @@
         </Dependencies>
         <Properties>
             <Framework>false</Framework>
-            <DisplayName>mpckit</DisplayName>
+            <DisplayName>MPCkit</DisplayName>
             <PublisherDisplayName>bajdev</PublisherDisplayName>
-            <Description>A mpckit application</Description>
+            <Description>MPCkit, a kit editor for the MPC Sample</Description>
             <Logo>Assets\AppIcon.png</Logo>
         </Properties>
     </PackageInformation>

+ 2 - 2
build/windows/nsis/wails_tools.nsh

@@ -11,10 +11,10 @@
     !define INFO_COMPANYNAME "bajdev"
 !endif
 !ifndef INFO_PRODUCTNAME
-    !define INFO_PRODUCTNAME "mpckit"
+    !define INFO_PRODUCTNAME "MPCkit"
 !endif
 !ifndef INFO_PRODUCTVERSION
-    !define INFO_PRODUCTVERSION "0.5.0"
+    !define INFO_PRODUCTVERSION "0.5.1"
 !endif
 !ifndef INFO_COPYRIGHT
     !define INFO_COPYRIGHT "(c) 2026 bajdev"

+ 1 - 1
build/windows/wails.exe.manifest

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
-    <assemblyIdentity type="win32" name="com.monoexp.mpckit" version="0.5.0" processorArchitecture="*"/>
+    <assemblyIdentity type="win32" name="com.monoexp.mpckit" version="0.5.1" processorArchitecture="*"/>
     <dependency>
         <dependentAssembly>
             <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>

+ 9 - 9
docs/build-plan.md

@@ -1,8 +1,8 @@
-# mpckit 0.5.0 build plan
+# MPCkit 0.5.0 build plan
 
 0.5.0 is a beta release for testing. The milestones for 1.0 (including beta testers using pre-1.0 versions) will be added later.
 
-Written 2026-11-10. Companion to `mpckit/xpj-format-and-scope.md` (format reference, verified edit recipes, agreed 0.5.0 scope) and the "mpckit main screen mockup" design artifact. Read the format doc first; this plan does not repeat the field paths.
+Written 2026-11-10. Companion to `mpckit/xpj-format-and-scope.md` (format reference, verified edit recipes, agreed 0.5.0 scope) and the "MPCkit main screen mockup" design artifact. Read the format doc first; this plan does not repeat the field paths.
 
 ## 1. What 0.5.0 is
 
@@ -194,7 +194,7 @@ Load an existing project, missing-file badges, unsaved-changes prompts, overwrit
 Done when: Device checkpoint B passes.
 
 **M9. Packaging and release.**
-Icons, version stamping, builds for the three systems, README with install notes, licence. The About modal and README state that mpckit is not affiliated with Akai.
+Icons, version stamping, builds for the three systems, README with install notes, licence. The About modal and README state that MPCkit is not affiliated with Akai.
 Done when: a tagged v0.5.0 build runs on each system.
 
 ## 7. Device checkpoints
@@ -212,7 +212,7 @@ Results (2026-11-10, on the device): all passed. Tuning limits confirmed; mute g
 
 **WAV test pack (`mpckit-wav-tests.zip`, built 2026-11-10 with the prototype writer):**
 
-Akai's published spec for the device: file import at 16 or 24-bit and 44.1, 48 or 96 kHz; internal processing at 44.1 kHz, 32-bit float. That describes importing through the device's own browser. mpckit places files straight into the project folder, so the test checks whether the device still converts them when it loads a project.
+Akai's published spec for the device: file import at 16 or 24-bit and 44.1, 48 or 96 kHz; internal processing at 44.1 kHz, 32-bit float. That describes importing through the device's own browser. MPCkit places files straight into the project folder, so the test checks whether the device still converts them when it loads a project.
 
 Every file is the same one-second sound: 0.8 s at 440 Hz, then 0.2 s an octave higher as an end marker. Each pad should match A1 in pitch and length, and the high beep must be heard at the end.
 
@@ -231,20 +231,20 @@ Every file is the same one-second sound: 0.8 s at 440 Hz, then 0.2 s an octave h
 | | A4 | 44.1 kHz 32-bit float stereo (outside the spec) |
 
 How to read the results:
-- Lower pitch and longer than A1: the device played the file as if it were 44.1 kHz. mpckit must then convert such files at export, or refuse them.
-- End beep missing: the slice end is being read in 44.1 kHz frames. mpckit must then scale `sliceInfo.End` for other sample rates.
-- Project fails to load, or a pad is silent: that format is refused; mpckit rejects it at assign time.
+- Lower pitch and longer than A1: the device played the file as if it were 44.1 kHz. MPCkit must then convert such files at export, or refuse them.
+- End beep missing: the slice end is being read in 44.1 kHz frames. MPCkit must then scale `sliceInfo.End` for other sample rates.
+- Project fails to load, or a pad is silent: that format is refused; MPCkit rejects it at assign time.
 
 Results (2026-11-10, on the device): both projects loaded and every pad in W1 and W2 played at the correct pitch and through to the end beep, including the four formats outside Akai's spec.
 
 Conclusions:
-- The device reads each WAV's own header when it loads a project and converts as needed. mpckit does not have to convert audio.
+- The device reads each WAV's own header when it loads a project and converts as needed. MPCkit does not have to convert audio.
 - `sliceInfo.End` is counted in the file's own frames at its own sample rate. (The 22.05 kHz pad settles this: read as 44.1 kHz frames it would have stopped halfway, before the beep.)
 - Accepted so far: 8, 16, 24 and 32-bit integer and 32-bit float; mono and stereo; 22.05, 44.1, 48 and 96 kHz.
 
 0.5.0 rule for assigning a file: accept any uncompressed WAV (integer PCM or 32-bit float), mono or stereo. Refuse compressed WAVs (ADPCM, MP3-in-WAV), more than two channels, and anything over 20 minutes.
 
-Not yet tested: sample rates above 96 kHz or below 22.05 kHz; 64-bit float (refused in 0.5.0). The extensible header that many audio tools write was confirmed in checkpoint A (PCM inside, 16 and 24-bit, mono and stereo); mpckit accepts it when it declares PCM or float inside.
+Not yet tested: sample rates above 96 kHz or below 22.05 kHz; 64-bit float (refused in 0.5.0). The extensible header that many audio tools write was confirmed in checkpoint A (PCM inside, 16 and 24-bit, mono and stereo); MPCkit accepts it when it declares PCM or float inside.
 
 **B (after M8), round trips through the app:** step-by-step projects and a results table in `docs/checkpoint-b.md`.
 1. Load `DemoFile` (recorded notes), change nothing, export: sequences still play the same on the device.

+ 3 - 3
docs/mockup/Main.dc.html

@@ -2,7 +2,7 @@
 <html lang="en">
 <head>
 <meta charset="utf-8">
-<title>mpckit main screen</title>
+<title>MPCkit main screen</title>
 <script src="./support.js"></script>
 </head>
 <body>
@@ -18,7 +18,7 @@ a{color:#F5A524}a:hover{color:#FFC35A}
 <div style="max-width: 1280px; margin: 0 auto; padding: 24px; display: flex; flex-direction: column; gap: 20px; background: #15171A; color: #F2F3F5; font-family: Inter, system-ui, sans-serif; font-size: 14px; line-height: 1.4">
 
 <div style="display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-bottom: 12px; border-bottom: 1px solid #353A43">
-<h1 style="margin: 0; font-family: 'Space Grotesk', sans-serif; font-weight: 700; font-size: 24px; letter-spacing: 0.02em">mpckit</h1>
+<h1 style="margin: 0; font-family: 'Space Grotesk', sans-serif; font-weight: 700; font-size: 24px; letter-spacing: 0.02em">MPCkit</h1>
 <button type="button" onClick="{{openAbout}}" style="min-height: 44px; padding: 0 8px; background: transparent; color: {{accent}}; border: 0; font: inherit; font-weight: 500; text-decoration: underline; text-underline-offset: 3px; cursor: pointer">About</button>
 </div>
 
@@ -220,7 +220,7 @@ Play
 <sc-if value="{{aboutOpen}}" hint-placeholder-val="{{ false }}">
 <div style="position: fixed; top: 0; right: 0; bottom: 0; left: 0; padding: 24px; display: flex; align-items: center; justify-content: center; background: rgba(10, 11, 13, 0.78)">
 <div role="dialog" aria-modal="true" aria-labelledby="about-title" style="width: 100%; max-width: 440px; padding: 24px; display: flex; flex-direction: column; gap: 14px; background: #1E2126; color: #F2F3F5; border: 1px solid #4A505B; border-radius: 12px">
-<h2 id="about-title" style="margin: 0; font-family: 'Space Grotesk', sans-serif; font-size: 22px; font-weight: 700">About mpckit</h2>
+<h2 id="about-title" style="margin: 0; font-family: 'Space Grotesk', sans-serif; font-size: 22px; font-weight: 700">About MPCkit</h2>
 <p style="margin: 0; color: #C9CDD4">A desktop project and kit editor for the MPC Sample. Build kits on your computer, then export them to the device.</p>
 <div style="display: flex; flex-direction: column; gap: 6px; font-family: 'IBM Plex Mono', monospace; font-size: 12px; color: #C9CDD4">
 <span>Version [VERSION]</span>

+ 9 - 9
docs/xpj-format-and-scope.md

@@ -1,4 +1,4 @@
-# mpckit: MPC Sample project format and 0.5.0 / 2.0 scope
+# MPCkit: MPC Sample project format and 0.5.0 / 2.0 scope
 
 Sources: three projects saved on an MPC Sample, in `testdata/device/` of `bajdev/mpckit` (first committed as `demo-projects/`), analysed 2026-11-10.
 
@@ -28,7 +28,7 @@ In:
 - Export to a folder or zip: the `.xpj` plus its `_[ProjectData]` folder.
 - Audio: WAV only.
 
-UI (mockup agreed 2026-11-10, "mpckit main screen mockup" artifact):
+UI (mockup agreed 2026-11-10, "MPCkit main screen mockup" artifact):
 - Title row with an About link that opens a modal.
 - Project name with New, Load, Export zip, Export to folder.
 - Two tabs: Pads and Sequences. Each has bank buttons A-H, a 4x4 grid (pad 1 bottom-left) and a settings panel for the selected slot.
@@ -83,7 +83,7 @@ Rename the `.xpj` and the `_[ProjectData]` folder together. Nothing inside the f
 5. Set `pad[n].tempo` to 20.0 (the value the device writes when the sample has no tempo).
 6. Set `layer.sliceInfo.LoopCrossfadeLength` to -1 (what the device wrote for an untouched non-factory sample).
 
-The device gave the second pad its own copy of the file (`Linn 9000 kick001.wav`, byte-identical to the first) and its own pool entry. Sharing also works: a test project with two pads pointing at one file and one pool entry loaded and played (section 7), so mpckit can store each file once.
+The device gave the second pad its own copy of the file (`Linn 9000 kick001.wav`, byte-identical to the first) and its own pool entry. Sharing also works: a test project with two pads pointing at one file and one pool entry loaded and played (section 7), so MPCkit can store each file once.
 
 ### Move or copy a pad (proposed, not yet device-tested)
 A pad's settings hold nothing that depends on its slot: all 128 blank pads are identical. So:
@@ -97,7 +97,7 @@ Recorded notes follow the slot, not the sample (a note stores 36 + n). Moving a
 Three fields on the layer, written together:
 - `layer.coarseTune` (semitones, integer; demo: 12)
 - `layer.fineTune` (cents, integer; demo: 40)
-- `layer.pitch` = coarse + fine / 100, stored as a 32-bit float (demo: the device wrote 12.399999618530274; mpckit writes the shortest form of the same float64, 12.399999618530273)
+- `layer.pitch` = coarse + fine / 100, stored as a 32-bit float (demo: the device wrote 12.399999618530274; MPCkit writes the shortest form of the same float64, 12.399999618530273)
 
 ### Trim start and end
 - `layer.sliceInfo.Start` and `layer.sliceInfo.LoopStart` = start frame (demo: 328)
@@ -218,7 +218,7 @@ Copy the blank sequence, set `sequences[].key` to the slot (0-based), then name,
 - Seen: 44.1 kHz, 16-bit mono (user sample), 16-bit and 24-bit stereo (factory).
 - Every file saved by the device carries extra chunks: `atem` (JSON: default slice, bar count, key), `smpl`, and on factory files `meta`. The non-factory kick has `atem` and `smpl` too, so the device adds them itself when it saves.
 - The sample's key in the project (`C Natural Minor`) matches the `atem` chunk in its file.
-- Device-tested 2026-11-10 with plain WAVs placed straight into the project folder: 8, 16, 24 and 32-bit integer and 32-bit float; mono and stereo; 22.05, 44.1, 48 and 96 kHz all loaded and played at the correct pitch and full length. The device converts on load, so mpckit does not need to. `sliceInfo.End` is in the file's own frames at its own sample rate. Details and remaining unknowns are in the build plan, section 7.
+- Device-tested 2026-11-10 with plain WAVs placed straight into the project folder: 8, 16, 24 and 32-bit integer and 32-bit float; mono and stereo; 22.05, 44.1, 48 and 96 kHz all loaded and played at the correct pitch and full length. The device converts on load, so MPCkit does not need to. `sliceInfo.End` is in the file's own frames at its own sample rate. Details and remaining unknowns are in the build plan, section 7.
 
 ## 7. Device tests
 
@@ -243,8 +243,8 @@ Project name confirmed: the device shows `MpckitT1`, taken from the file and fol
 Four projects written by the Go writer (`tools/checkpoint-a`, built from commit `f36cda3`). All loaded and passed on the device:
 
 - **Kit** (`MpckitKit`): samples on A1-A4 and B1 play. Tuning at -24 and +24 semitones, -90 and +90 cents, and both combined (-24/-90, +24/+90) loads and plays as expected. Two hats in mute group 1 choke each other. Sequences of 1 and 64 bars work.
-- **Mute groups** (`MpckitMute`): the device offers none and 1-16. Pads written with group 16 choke each other; so do pads written with group 32, though editing such a pad's group on the device starts it at 16. mpckit writes 0-16 only.
-- **Tempo** (`MpckitTempo`): sequences at 20, 30, 300 and 999 BPM all work. The device's tempo control runs from 20 to 999, and mpckit uses the same range.
+- **Mute groups** (`MpckitMute`): the device offers none and 1-16. Pads written with group 16 choke each other; so do pads written with group 32, though editing such a pad's group on the device starts it at 16. MPCkit writes 0-16 only.
+- **Tempo** (`MpckitTempo`): sequences at 20, 30, 300 and 999 BPM all work. The device's tempo control runs from 20 to 999, and MPCkit uses the same range.
 - **WAV headers** (`MpckitWav`): 48 kHz 24-bit stereo, 44.1 kHz 16-bit stereo and mono, all with the extensible header, play the same as a plain-header control.
 
 Every item on the original 0.5.0 list (project name, pad sample assignment, sequence name, BPM, bar length, adding a sequence) plus pad tuning has now been written by these recipes and accepted by the device.
@@ -267,5 +267,5 @@ Five projects made from DemoFile in the app, exported, and loaded on the device
 3. `triggerMode` values (0 and 3 seen) and how they pair with `loopMode`.
 4. ~~When a sequence with notes is shortened, are notes past the new end kept or removed?~~ Answered 2026-11-11 (checkpoint B5): kept. They don't play while the sequence is shorter, and play again when it is lengthened on the device.
 5. Sample rates outside 22.05-96 kHz and 64-bit float are untested. (The extensible header was confirmed in checkpoint A; other WAV bit depths and sample rates are confirmed; non-WAV formats are out of 0.5.0.)
-6. What key and tempo to write for a sample mpckit imports (the device detects them; mpckit cannot yet).
-7. Is `currentSequence` a slot number or an index into `sequences[]`? Every file seen has 0, and slot 0 is stored second, so the files cannot tell. mpckit treats it as a slot (build plan 4.3). Checkpoint B4 (removing the current sequence) worked, with Sequence 02 selected on open, but in that file slot 1 and list position 1 are the same sequence, so it does not tell them apart. Still open.
+6. What key and tempo to write for a sample MPCkit imports (the device detects them; MPCkit cannot yet).
+7. Is `currentSequence` a slot number or an index into `sequences[]`? Every file seen has 0, and slot 0 is stored second, so the files cannot tell. MPCkit treats it as a slot (build plan 4.3). Checkpoint B4 (removing the current sequence) worked, with Sequence 02 selected on open, but in that file slot 1 and list position 1 are the same sequence, so it does not tell them apart. Still open.

+ 1 - 1
frontend/index.html

@@ -3,7 +3,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>mpckit</title>
+    <title>MPCkit</title>
   </head>
   <body>
     <div id="app"></div>

+ 1 - 1
frontend/src/App.svelte

@@ -116,7 +116,7 @@
 
 <div class="page">
   <header>
-    <h1 class="visually-hidden">mpckit</h1>
+    <h1 class="visually-hidden">MPCkit</h1>
     <div class="name">
       <label class="eyebrow" for="project-name">Project name</label>
       <input id="project-name" type="text" value={st?.name ?? ""} spellcheck="false" autocomplete="off" onchange={rename} />

+ 1 - 1
frontend/src/lib/AboutModal.svelte

@@ -28,7 +28,7 @@
 <!-- svelte-ignore a11y_click_events_have_key_events, a11y_no_static_element_interactions (clicking outside the dialog closes it; Escape and the Close button do the same from the keyboard) -->
 <div class="backdrop" onclick={(e) => e.target === e.currentTarget && onclose()}>
   <div class="dialog" role="dialog" aria-modal="true" aria-labelledby="about-title">
-    <h2 id="about-title">About mpckit</h2>
+    <h2 id="about-title">About MPCkit</h2>
     <p class="lead">A desktop project and kit editor for the MPC Sample. Build kits on your computer, then export them to the device.</p>
     <div class="facts">
       <span>Version {about?.version ?? ""}</span>

+ 3 - 3
internal/project/project.go

@@ -1,4 +1,4 @@
-// Package project is the mpckit domain model: one MPC Sample project and
+// Package project is the MPCkit domain model: one MPC Sample project and
 // every edit 0.5.0 makes to it. Edits follow the verified recipes in
 // docs/xpj-format-and-scope.md section 3 and change only the fields those
 // recipes name; everything else is written back as read.
@@ -124,10 +124,10 @@ func Load(path string) (*Project, []string, error) {
 
 	var warnings []string
 	if f.Header[1] != xpj.TestedHeader[1] {
-		warnings = append(warnings, fmt.Sprintf("saved by firmware %s; mpckit is tested with %s", f.Header[1], xpj.TestedHeader[1]))
+		warnings = append(warnings, fmt.Sprintf("saved by firmware %s; MPCkit is tested with %s", f.Header[1], xpj.TestedHeader[1]))
 	}
 	if v, err := p.data.Lookup("version").Int(); err != nil || v != TestedVersion {
-		warnings = append(warnings, fmt.Sprintf("project data version %d; mpckit is tested with %d", v, TestedVersion))
+		warnings = append(warnings, fmt.Sprintf("project data version %d; MPCkit is tested with %d", v, TestedVersion))
 	}
 	for _, e := range p.pool().Items {
 		file := e.Lookup("path").Text

+ 1 - 1
internal/project/sequences.go

@@ -13,7 +13,7 @@ const (
 	eventNote       = 3
 )
 
-// MaxBars is the longest sequence mpckit writes. 64 bars is confirmed on the
+// MaxBars is the longest sequence MPCkit writes. 64 bars is confirmed on the
 // device (checkpoint A5); its own maximum is not yet known.
 const MaxBars = 999
 

+ 2 - 2
internal/wav/wav.go

@@ -18,7 +18,7 @@ const (
 	FormatExtensible = 0xFFFE
 )
 
-// Limits for a sample mpckit will assign (build plan 4.3 and section 7).
+// Limits for a sample MPCkit will assign (build plan 4.3 and section 7).
 const (
 	MaxChannels = 2
 	MaxDuration = 20 * time.Minute
@@ -142,7 +142,7 @@ func (i *Info) parseFmt(b []byte) error {
 	return nil
 }
 
-// Validate reports why the device or mpckit cannot use the file, or nil.
+// Validate reports why the device or MPCkit cannot use the file, or nil.
 // Accepted: uncompressed integer PCM (8, 16, 24, 32-bit) or 32-bit float,
 // mono or stereo, at most 20 minutes.
 func (i Info) Validate() error {

+ 3 - 3
main.go

@@ -1,4 +1,4 @@
-// Command mpckit is the desktop kit editor for the MPC Sample.
+// Command mpckit is MPCkit, the desktop kit editor for the MPC Sample.
 package main
 
 import (
@@ -44,7 +44,7 @@ func main() {
 	d := &dialogs{}
 	svc := app.NewService(d)
 	a := application.New(application.Options{
-		Name:        "mpckit",
+		Name:        "MPCkit",
 		Description: "Desktop kit editor for the MPC Sample",
 		Services: []application.Service{
 			application.NewService(svc),
@@ -63,7 +63,7 @@ func main() {
 	// Start hidden and size the window once the screens are known, so it
 	// fits the display instead of being clamped by it.
 	w := a.Window.NewWithOptions(application.WebviewWindowOptions{
-		Title:            "mpckit",
+		Title:            "MPCkit",
 		Width:            maxWidth,
 		Height:           maxHeight,
 		MinWidth:         minWidth,

+ 32 - 0
pull-requests/mpckit-casing/name-the-app-mpckit.md

@@ -0,0 +1,32 @@
+# Name the app MPCkit; release 0.5.1
+
+Branch: `mpckit-casing` → `main`
+
+## What changed
+
+The app's name is written **MPCkit** wherever people see it:
+
+- **The app:** the window title, the app name Wails uses, the page title, the (screen-reader) page heading, and "About MPCkit". The Load warnings now say "MPCkit is tested with …".
+- **Build metadata:** product name in `build/config.yml`, Windows file properties (`info.json`), the macOS bundle name (`CFBundleName`), the NSIS installer's product name, and the MSIX display names and description. The Linux menu entry uses a new `PRODUCT_NAME: "MPCkit"` in `Taskfile.yml`.
+- **Docs:** README, build plan, format doc, the checkpoint A README, the mockup, and code comments.
+
+**Kept lowercase:** these are identifiers or file names, not the displayed name.
+- The repo and Go module path (`bajdev/mpckit`).
+- The executable and bundle file names, which come from `APP_NAME: "mpckit"`: `bin/mpckit`, `mpckit.exe`, `mpckit.app`, the Linux package name.
+- The bundle identifier `com.monoexp.mpckit`, `mpckit-cli`, `mpckit-checkpoint-a.zip`, and internal names (the drag data type, temp-folder prefixes, the frontend package name).
+- The historical PR records in `pull-requests/`.
+
+**Version 0.5.1** (bajdev, 2026-11-12): `v0.5.0` was tagged before this rename, so this is released as 0.5.1 rather than moving that tag. `APP_VERSION` and the version in every build file are now 0.5.1. The README's beta note now says "The 0.5 releases are betas", and a new "Releasing" paragraph lists the files that carry the version. After the merge, the merge commit is tagged `v0.5.1`.
+
+**File names stay lowercase** (bajdev, 2026-11-12): `mpckit.exe`, `mpckit.app`, `bin/mpckit`.
+
+**Also fixed:** the MSIX manifests still had the template's `com.example.mpckit` identifier; it is now `com.monoexp.mpckit`. Their install folder is `C:\Program Files\MPCkit`.
+
+## Testing
+
+On the server: `go vet` (also for Windows) and `go test ./...` pass; the Taskfile parses. Frontend changes are text only.
+
+**On the laptop:**
+1. `npm run check` in `frontend`: 0 errors, 0 warnings.
+2. `wails3 build`, run `bin\mpckit.exe`: the window title and taskbar say MPCkit, and About says "About MPCkit" and "Version 0.5.1".
+3. Properties → Details of `mpckit.exe`: product name MPCkit, version 0.5.1.

+ 1 - 1
tools/checkpoint-a/README.md

@@ -52,7 +52,7 @@ A1 and A2 (hats) in group 16; A3 and A4 in group 1.
 1. Does the project load?
 2. What group does each pad show? Do A1/A2 choke each other, and A3/A4?
 
-The 2026-11-10 run used groups 16 and 32, built from commit `f36cda3`. Since the device's limit turned out to be 16, mpckit now refuses 32 and this project uses 1 and 16.
+The 2026-11-10 run used groups 16 and 32, built from commit `f36cda3`. Since the device's limit turned out to be 16, MPCkit now refuses 32 and this project uses 1 and 16.
 
 ### MpckitTempo: BPM extremes (A5)
 

+ 1 - 1
tools/checkpoint-a/main.go

@@ -137,7 +137,7 @@ func build(src, work string) ([]*project.Project, error) {
 		},
 		{
 			// A3: the lowest and highest mute groups. The 2026-11-10 run
-			// used 16 and 32 (see README); mpckit now refuses 32.
+			// used 16 and 32 (see README); MPCkit now refuses 32.
 			name: "MpckitMute",
 			pads: []pad{
 				{label: "A1", file: hat1, mute: 16}, {label: "A2", file: hat2, mute: 16},

+ 1 - 1
tools/icon/main.go

@@ -1,4 +1,4 @@
-// Command icon draws the mpckit app icon: a 4x4 pad grid on the app's dark
+// Command icon draws the MPCkit app icon: a 4x4 pad grid on the app's dark
 // background, with pad 1 (bottom left, as on the device) lit in the accent
 // colour. It writes a 1024x1024 PNG; `wails3 generate icons` makes the
 // Windows and macOS icons from it.