// Music app UI

Hardware Sampler App UI Design in Expo

Industrial Sampler is a skeuomorphic music app UI that looks like a piece of studio hardware, split across a player deck and a full controller.

Screens
2
Built with
Expo SDK 58
Fonts
Barlow Condensed, Helvetica Neue
License
Free (MIT)
Skeuomorphic sampler controller screen with knobs, keys and a yellow fader

Industrial Sampler app screens

Hardware style music player app screen with knobs, fader and waveform

Player deck

A lock-screen clock with widgets and a session waveform above a pale deck of knobs, small keys, a volume fader and touch pads.

Skeuomorphic sampler controller screen with knobs, keys and a yellow fader

Universal controller

A textured metal panel with split keys, a ribbed yellow fader, large knobs, mini slots, a tune dial and foot pedals.

Copy the Industrial Sampler kit

Use the artifact as a design brief, the skill to generate the UI with an AI agent, or the code to run it right away.

Design artifact

The full design: tokens, screens and source

# Industrial Sampler: design artifact

Industrial Sampler is a skeuomorphic music app UI that looks like a piece of studio hardware, split across a player deck and a full controller.

- Type: Music mobile app UI
- Screens: 2
- Artboard: 390 × 844
- Target: Expo SDK 58, Expo Router, TypeScript, expo-haptics, expo-linear-gradient, react-native-svg
- Live page: https://developermill.com/app-designs/industrial-sampler-app-ui-design

## Design direction

Moulded grey hardware with engraved labels, machined knobs, latching key caps, LEDs and a tall yellow fader under a black lock screen.

- Draggable rotary knobs, faders and a tune dial
- Latching key caps with physical travel
- Animated LEDs and a live waveform
- Haptic feedback on every control

## Foundations

### Colour

| Token | Hex |
| --- | --- |
| Signal orange | `#FF5A1F` |
| Fader yellow | `#E9DA22` |
| Panel | `#8F8C87` |
| Deck | `#D5D5D3` |
| Engrave | `#2B2A28` |
| Lock black | `#070707` |

### Typography

- Typefaces: Barlow Condensed, Helvetica Neue
- Common sizes (px): 5.5, 6.5, 8.5, 9.5, 10, 15, 92

### Shape and depth

- Common corner radii (px): 3, 4, 5, 6, 20
- Shadows: `Native shadows for knobs, faders and LEDs`

## Screens

### 1. Player deck

A lock-screen clock with widgets and a session waveform above a pale deck of knobs, small keys, a volume fader and touch pads.

Preview: https://developermill.com/app-designs/industrial-sampler-app-ui-design/player.webp

### 2. Universal controller

A textured metal panel with split keys, a ribbed yellow fader, large knobs, mini slots, a tune dial and foot pedals.

Preview: https://developermill.com/app-designs/industrial-sampler-app-ui-design/controller.webp

## Design tokens in code

```ts
import { createContext, useContext } from 'react';
import { Platform, useWindowDimensions } from 'react-native';

// Demo textures are hosted by DeveloperMill. Point this at your own CDN, or swap to require().
const ASSET_BASE = 'https://developermill.com/app-designs/industrial-sampler-app-ui-design/assets';

export const asset = (name: string) => `${ASSET_BASE}/${name}`;

export const DESIGN_WIDTH = 390;

export const COLORS = {
  panel: '#8F8C87',
  well: '#615E5A',
  engrave: '#2B2A28',
  labelLight: '#ECEAE6',
  groove: '#1C1C1B',
  orange: '#FF5A1F',
  orangeHi: '#FF7A45',
  yellow: '#E9DA22',
  yellowHi: '#F6EC5A',
  yellowLo: '#B8A812',
  ledOff: '#3A3836',
  black: '#1E1D1C',
};

// Each key cap: gradient top, gradient bottom, side wall, legend colour.
export const CAPS = {
  light: ['#E6E3DE', '#CFCCC6', '#8E8B86', '#2B2A28'],
  grey: ['#BDBAB5', '#A9A6A1', '#77746F', '#2B2A28'],
  flat: ['#A9A6A1', '#9D9A95', '#7A7772', '#ECEAE6'],
  orange: ['#FF6E33', '#F04E17', '#A8330B', '#FFFFFF'],
  dark: ['#403F3D', '#282726', '#121212', '#F2F0EC'],
  paper: ['#F3F3F1', '#DFDFDD', '#A9A9A6', '#3C3C3A'],
  paperShade: ['#D6D6D3', '#C8C8C5', '#9B9B98', '#3C3C3A'],
} as const;

export type CapVariant = keyof typeof CAPS;

export const LABEL_FONT = Platform.select({
  ios: 'Helvetica Neue',
  android: 'sans-serif',
  default: "'Helvetica Neue', Helvetica, Arial, sans-serif",
});

export const ScaleContext = createContext<number | null>(null);

/** Converts artboard units to device pixels, capped so tablets keep phone proportions. */
export function useUnit() {
  const { width } = useWindowDimensions();
  const measured = useContext(ScaleContext);
  const scale = Math.min(measured ?? width, 430) / DESIGN_WIDTH;
  return (value: number) => value * scale;
}
```

SKILL.md

Save as .claude/skills/industrial-sampler-app-ui/SKILL.md

---
name: industrial-sampler-app-ui
description: Build the Industrial Sampler mobile app UI in Expo React Native. Use when asked to create a skeuomorphic app UI or a new screen in this visual style.
---

# Industrial Sampler app UI

Build this UI in an Expo SDK 58 app with Expo Router and strict TypeScript. Match the spec below rather than inventing a new look. The finished reference lives at https://developermill.com/app-designs/industrial-sampler-app-ui-design

## Visual direction

Moulded grey hardware with engraved labels, machined knobs, latching key caps, LEDs and a tall yellow fader under a black lock screen.

Keep these signature details:

- Draggable rotary knobs, faders and a tune dial
- Latching key caps with physical travel
- Animated LEDs and a live waveform
- Haptic feedback on every control

## Set up

```bash
npx expo install expo-haptics expo-linear-gradient react-native-svg @expo-google-fonts/barlow-condensed expo-font
```

## Tokens

| Token | Hex |
| --- | --- |
| Signal orange | `#FF5A1F` |
| Fader yellow | `#E9DA22` |
| Panel | `#8F8C87` |
| Deck | `#D5D5D3` |
| Engrave | `#2B2A28` |
| Lock black | `#070707` |

- Typefaces: Barlow Condensed, Helvetica Neue
- Common sizes (px): 5.5, 6.5, 8.5, 9.5, 10, 15, 92
- Common corner radii (px): 3, 4, 5, 6, 20

Define these once and reuse them. Do not add new colours.

## Screens

Build one Expo Router route per screen, in this order:

1. **Player deck**: A lock-screen clock with widgets and a session waveform above a pale deck of knobs, small keys, a volume fader and touch pads.
2. **Universal controller**: A textured metal panel with split keys, a ribbed yellow fader, large knobs, mini slots, a tune dial and foot pedals.

## Build rules

- Design on a 390 × 844 artboard, then scale to the device width so layouts match on every phone.
- Load each custom font weight by its own family name with expo-font. Do not rely on `fontWeight` with custom fonts.
- Draw icons, charts and illustrations with react-native-svg rather than image files or chart libraries.
- Use `Pressable` with an `accessibilityLabel` for every icon-only control, and keep touch targets at 44 px or larger.
- Wire navigation with `router.navigate`, and keep sample data in constants at the top of each file so it is easy to replace.
- Use expo-image for photos, with `contentFit` set explicitly.

## Done when

- Every screen above exists as a route and they link together.
- Colours, type and radii match the tokens exactly.
- `npx tsc --noEmit` and `npx expo lint` both pass.
- Layouts hold up on small and large phones.

Set up the project

npx create-expo-app@latest industrial-sampler-app --template default
cd industrial-sampler-app
rm -rf src
npx expo install expo-haptics expo-linear-gradient react-native-svg @expo-google-fonts/barlow-condensed expo-font

src/app/_layout.tsx

import { BarlowCondensed_700Bold } from '@expo-google-fonts/barlow-condensed';
import { useFonts } from 'expo-font';
import { Stack } from 'expo-router';
import { SafeAreaProvider } from 'react-native-safe-area-context';

export default function RootLayout() {
  const [fontsLoaded] = useFonts({ BarlowCondensed_700Bold });

  if (!fontsLoaded) return null;

  return (
    <SafeAreaProvider>
      <Stack screenOptions={{ headerShown: false }} />
    </SafeAreaProvider>
  );
}

About this design

It is one of the most interactive designs here: knobs and faders respond to drag, key caps latch with real travel, LEDs blink, and the waveform moves while playing. Native haptics fire on every control.

Moulded grey hardware with engraved labels, machined knobs, latching key caps, LEDs and a tall yellow fader under a black lock screen.

  • Draggable rotary knobs, faders and a tune dial
  • Latching key caps with physical travel
  • Animated LEDs and a live waveform
  • Haptic feedback on every control

Colour palette

  • Signal orange

    #FF5A1F

  • Fader yellow

    #E9DA22

  • Panel

    #8F8C87

  • Deck

    #D5D5D3

  • Engrave

    #2B2A28

  • Lock black

    #070707

How to use this design

  1. 01

    Pick what to copy

    Copy the Industrial Sampler artifact, skill or code from this page.

  2. 02

    Run it or generate it

    Paste the code into a new Expo app and start it, or give the skill to your AI coding agent.

  3. 03

    Make it yours

    Replace the demo images and sample content, then connect your own data.

Frequently asked questions

Do the knobs and faders really move?

Yes. Drag gestures use React Native PanResponder, so knobs rotate, faders slide and the volume fader also updates the on-screen ring widget.

Is the Industrial Sampler design free to use?

Yes. The design, skill and Expo code are free and MIT licensed, including for commercial apps. Replace the demo images and sample content with your own before you ship.

What is the difference between the artifact, skill and code?

The artifact is the full design: tokens, screens and source. The skill is a SKILL.md that teaches an AI coding agent to build the UI. The code is the finished Expo app you can paste in and run.

Which Expo version does the code use?

It targets Expo SDK 58 with Expo Router and TypeScript. It uses packages installed through npx expo install, with no custom native code.

More app UI designs