Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fbabbcf623 | ||
|
|
cd93e2aacf | ||
|
|
f72fedd0a1 |
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 104 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 93 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 142 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 85 KiB |
@@ -85,9 +85,10 @@ export default async function CraftAppPage({ params }: { params: Params }) {
|
||||
const release = craftAppRelease(app);
|
||||
// The hero's download is ArtCraft Launcher, which installs this app and keeps
|
||||
// it updated; the app's own installers are in #get-it, under the launcher.
|
||||
const launcherDownloads = craftLauncherRecommended();
|
||||
// An app with no release yet has nothing for the launcher to install.
|
||||
const launcherDownloads = release ? craftLauncherRecommended() : [];
|
||||
const allLauncherDownloads = craftLauncherDownloads();
|
||||
const hasDownload = launcherDownloads.length > 0 || release !== null;
|
||||
const hasDownload = release !== null;
|
||||
const [hero] = app.shots;
|
||||
const [before, accent, after] = app.headline;
|
||||
const shareUrl = siteUrl(craftAppPath(app));
|
||||
|
||||
@@ -45,7 +45,7 @@ import { siteUrl } from "@/lib/links";
|
||||
|
||||
const TITLE = "Crafting Apps: open-source creative tools";
|
||||
const COVERAGE =
|
||||
"Image editing, vector illustration, video, photography, PDFs, motion graphics, page layout, interface design, word processing, audio, presentations, CAD and spreadsheets";
|
||||
"Image editing, vector illustration, video, photography, PDFs, motion graphics, page layout, interface design, beat making, word processing, audio, presentations, CAD and spreadsheets";
|
||||
const DESCRIPTION = `${COVERAGE}: ${CRAFTING_APPS_COUNT_WORD.toLowerCase()} native, open-source apps from the ArtCraft team, built in Rust and free to use.`;
|
||||
|
||||
export const metadata: Metadata = {
|
||||
|
||||
@@ -325,6 +325,7 @@ html[data-ruler="on"]::-webkit-scrollbar {
|
||||
.app-effectcraft { --app: #e0368f; --app-ink: #b0206c; }
|
||||
.app-designcraft { --app: #7bb51c; --app-ink: #457008; }
|
||||
.app-figcraft { --app: #02da96; --app-ink: #017a54; }
|
||||
.app-loopcraft { --app: #f0d824; --app-ink: #6f6300; }
|
||||
.app-wordcraft { --app: #4c6ef5; --app-ink: #253e99; }
|
||||
.app-soundcraft { --app: #14a9c4; --app-ink: #0b6f82; }
|
||||
.app-deckcraft { --app: #f26b1d; --app-ink: #ad4306; }
|
||||
@@ -338,6 +339,7 @@ html[data-ruler="on"]::-webkit-scrollbar {
|
||||
:root[data-theme="dark"] .app-effectcraft { --app-ink: #ff7ab8; }
|
||||
:root[data-theme="dark"] .app-designcraft { --app-ink: #a6e04a; }
|
||||
:root[data-theme="dark"] .app-figcraft { --app-ink: #3fe6ae; }
|
||||
:root[data-theme="dark"] .app-loopcraft { --app-ink: #f5e04f; }
|
||||
:root[data-theme="dark"] .app-wordcraft { --app-ink: #8da2fb; }
|
||||
:root[data-theme="dark"] .app-soundcraft { --app-ink: #52d1ea; }
|
||||
:root[data-theme="dark"] .app-deckcraft { --app-ink: #ff9657; }
|
||||
@@ -352,6 +354,7 @@ html[data-ruler="on"]::-webkit-scrollbar {
|
||||
:root:not([data-theme="light"]) .app-effectcraft { --app-ink: #ff7ab8; }
|
||||
:root:not([data-theme="light"]) .app-designcraft { --app-ink: #a6e04a; }
|
||||
:root:not([data-theme="light"]) .app-figcraft { --app-ink: #3fe6ae; }
|
||||
:root:not([data-theme="light"]) .app-loopcraft { --app-ink: #f5e04f; }
|
||||
:root:not([data-theme="light"]) .app-wordcraft { --app-ink: #8da2fb; }
|
||||
:root:not([data-theme="light"]) .app-soundcraft { --app-ink: #52d1ea; }
|
||||
:root:not([data-theme="light"]) .app-deckcraft { --app-ink: #ff9657; }
|
||||
|
||||
@@ -114,7 +114,11 @@ export function AppGallery({ app, index }: { app: CraftApp; index: string }) {
|
||||
rel="noopener noreferrer"
|
||||
className={twMerge(
|
||||
"group relative block overflow-hidden bg-bg-sunken",
|
||||
shot.portrait ? "aspect-[7/9]" : "aspect-[16/10]",
|
||||
shot.portrait
|
||||
? "aspect-[7/9]"
|
||||
: shot.wide
|
||||
? "aspect-video"
|
||||
: "aspect-[16/10]",
|
||||
)}
|
||||
>
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
|
||||
@@ -222,6 +222,7 @@ export const CRAFT_APP_RELEASES: Record<CraftAppSlug, CraftRelease | null> = {
|
||||
effectcraft: craftRelease("0.8.0"),
|
||||
designcraft: craftRelease("0.6.0"),
|
||||
figcraft: craftRelease("0.5.1"),
|
||||
loopcraft: null,
|
||||
wordcraft: craftRelease("0.5.0"),
|
||||
soundcraft: craftRelease("0.5.0"),
|
||||
deckcraft: craftRelease("0.5.0"),
|
||||
|
||||
@@ -30,6 +30,7 @@ export type CraftAppSlug =
|
||||
| "effectcraft"
|
||||
| "designcraft"
|
||||
| "figcraft"
|
||||
| "loopcraft"
|
||||
| "wordcraft"
|
||||
| "soundcraft"
|
||||
| "deckcraft"
|
||||
@@ -47,6 +48,8 @@ export type CraftShot = {
|
||||
alt: string;
|
||||
/** Portrait page (7:9) rather than a 16:10 window capture. */
|
||||
portrait?: boolean;
|
||||
/** 16:9 window capture rather than 16:10. */
|
||||
wide?: boolean;
|
||||
};
|
||||
|
||||
/** A feature clip with its own section under the hero. */
|
||||
@@ -646,6 +649,74 @@ export const CRAFTING_APPS: CraftApp[] = [
|
||||
caption: "A host and a guest editing one file",
|
||||
},
|
||||
},
|
||||
{
|
||||
slug: "loopcraft",
|
||||
prefix: "Loop",
|
||||
category: "Beat making & music production",
|
||||
status: "Early alpha",
|
||||
headline: ["Beats, patterns and ", "songs", ", in pure Rust."],
|
||||
pitch: "An open-source beat maker and music production studio, built in pure Rust.",
|
||||
lede: "A pattern-based music workstation: a step sequencer and piano roll for writing parts, a playlist for arranging them, and a mixer with effects for finishing them. Native, open source, and drivable end to end by AI agents.",
|
||||
schemaCategory: "MultimediaApplication",
|
||||
platforms: ["macOS", "Windows", "Linux"],
|
||||
rustVersion: "1.95",
|
||||
features: [
|
||||
{
|
||||
title: "Step sequencer",
|
||||
body: "Program drums in the channel rack, up to four bars a row, with swing, step fills and a graph editor for each step's velocity, pan, pitch and shift.",
|
||||
},
|
||||
{
|
||||
title: "A deep piano roll",
|
||||
body: "Draw, paint and slice notes, stamp chords and scale runs, then quantise, strum, arpeggiate or humanise them, with slide notes and ghost notes from other channels.",
|
||||
},
|
||||
{
|
||||
title: "Arrange in the playlist",
|
||||
body: "Place patterns and audio clips on tracks, resize, slice and duplicate them, drop time markers, and draw automation for any knob, fader or the tempo.",
|
||||
},
|
||||
{
|
||||
title: "Instruments and effects",
|
||||
body: "Twelve instruments, from a sampler and synths to drum machines and a slicer, and twenty-four effects, each with factory presets. The drum sounds are synthesised, not sampled.",
|
||||
},
|
||||
{
|
||||
title: "Record and mix",
|
||||
body: "Play parts in from a MIDI or computer keyboard, record audio takes, and mix on a master and twenty insert tracks with sends and sidechain compression.",
|
||||
},
|
||||
{
|
||||
title: "Agent-ready",
|
||||
body: "Every action is a command with an id, so a command-line tool, an MCP server and a control channel can write, arrange and export a track end to end.",
|
||||
},
|
||||
],
|
||||
shots: [
|
||||
{
|
||||
file: "hero.webp",
|
||||
source: "loopcraft-hero.png",
|
||||
caption: "First Light — channel rack, mixer and playlist",
|
||||
alt: "LoopCraft with its demo song open: the browser on the left, the channel rack with its step sequencer, the mixer with an effect rack, and the playlist with coloured pattern clips",
|
||||
wide: true,
|
||||
},
|
||||
{
|
||||
file: "light.webp",
|
||||
source: "light-theme.png",
|
||||
caption: "Light theme",
|
||||
alt: "LoopCraft in its light theme: the same windows on white panels with a dark application bar",
|
||||
wide: true,
|
||||
},
|
||||
{
|
||||
file: "piano-roll.webp",
|
||||
source: "piano-roll.png",
|
||||
caption: "Piano roll with a velocity lane",
|
||||
alt: "LoopCraft's piano roll showing a melody as green notes on a grid beside a piano keyboard, with a velocity lane underneath",
|
||||
wide: true,
|
||||
},
|
||||
{
|
||||
file: "instruments.webp",
|
||||
source: "instrument-and-mixer.png",
|
||||
caption: "Instrument editor over the playlist and mixer",
|
||||
alt: "LoopCraft's three-oscillator instrument editor, a grid of knobs for the oscillators, an envelope and a filter, floating over the playlist and mixer",
|
||||
wide: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
slug: "wordcraft",
|
||||
prefix: "Word",
|
||||
|
||||
Reference in new issue
Block a user