simple-beatmaker
Version:
Generate drum sounds from scratch and create beats programmatically with pure JavaScript - no external WAV files needed!
299 lines (215 loc) • 7.8 kB
Markdown
# Simple Beatmaker
A Node.js package that generates drum sounds from scratch and creates beats programmatically. No external WAV files needed - all drum sounds are synthesized using mathematical formulas!
## Features
- 🥁 **3 Drum Sets**: Classic (acoustic), Electronic (synthetic), Vintage (analog)
- 🎵 **5 Built-in Patterns**: basic-rock, electronic-dance, vintage-groove, funky-break, minimal-techno
- 🎛️ **Custom Patterns**: Create your own 16-step patterns
- 🔊 **6 Drum Types**: Kick, Snare, Hi-hat, Clap, Crash, Tom
- 🎮 **Easy Generation**: Generate template files with CLI commands
- ⚡ **Cross-platform**: Works on Windows, macOS, and Linux
## Installation
```bash
npm install -g simple-beatmaker
```
## Quick Start
### Option 1: Generate Template Files
Create a template file with all options:
```bash
beatmaker generate init
```
Or generate a simple kick-clap beat:
```bash
beatmaker generate kick-clap
```
Then edit the generated `.js` file and play it:
```bash
beatmaker play beatmaker-template.js
```
### Option 2: Create Your Own JS File
Create a file called `my-beat.js`:
```javascript
const SimpleBeatmaker = require('simple-beatmaker');
const beatmaker = new SimpleBeatmaker();
// Create and play a beat
beatmaker
.setBPM(120)
.setDrumSet('classic')
.usePreset('basic-rock')
.play(2); // Play 2 loops
```
Then play it:
```bash
beatmaker play my-beat.js
```
That's it! The command will execute your JavaScript file and generate a WAV file that plays automatically.
## CLI Commands
```bash
# Generate template files
beatmaker generate init # Creates beatmaker-template.js with all options
beatmaker generate kick-clap # Creates kick-clap-beat.js with simple beat
# Play JavaScript beat files
beatmaker play my-beat.js # Execute and play your beat file
# Get help
beatmaker help # Show all available commands
```
## API Reference
### Creating Beats
```javascript
const SimpleBeatmaker = require('simple-beatmaker');
const beatmaker = new SimpleBeatmaker();
// Set tempo
beatmaker.setBPM(120); // Default: 120 BPM
// Choose drum set
beatmaker.setDrumSet('classic'); // Options: 'classic', 'electronic', 'vintage'
// Set output directory (optional)
beatmaker.setOutputDir('beats'); // Save to 'beats' folder (creates if needed)
// Use a preset pattern
beatmaker.usePreset('basic-rock'); // See available presets below
// Or create custom pattern
beatmaker.createPattern(bars, pattern);
// Generate and play
beatmaker.play(loops, filename);
```
### Drum Sets
- **classic**: Warm acoustic drum sounds with natural tones
- **electronic**: Sharp synthetic drums with digital character
- **vintage**: Analog-style drums with warm, saturated sound
### Built-in Presets
- **basic-rock**: Classic 4/4 rock beat (4 bars)
- **electronic-dance**: Electronic dance pattern (2 bars)
- **vintage-groove**: Laid-back vintage groove (4 bars)
- **funky-break**: Syncopated funk pattern (2 bars)
- **minimal-techno**: Minimal techno beat (4 bars)
### Custom Patterns
Create 16-step patterns (16th notes per bar):
```javascript
const customPattern = [
// Bar 1
[
['kick'], null, ['hihat'], null, // Steps 1-4
['snare'], null, ['hihat'], null, // Steps 5-8
['kick'], null, ['hihat'], null, // Steps 9-12
['snare'], null, ['hihat'], null // Steps 13-16
],
// Bar 2
[
['kick'], ['hihat'], null, ['hihat'],
['snare'], ['snare'], ['hihat'], null,
['kick'], ['kick'], ['hihat'], ['snare'],
['snare'], ['kick'], ['hihat'], ['kick']
]
];
beatmaker.createPattern(2, customPattern);
```
#### Pattern Format
- Each bar has 16 steps (16th notes)
- `null` = silence on that step
- `['kick']` = kick drum on that step
- `['snare']` = snare drum on that step
- `['hihat']` = hihat on that step
- `['kick', 'snare']` = multiple drums on same step
#### Available Drums
- `kick` or `k`: Kick drum
- `snare` or `s`: Snare drum
- `hihat` or `h`: Hi-hat
- `clap` or `c`: Hand clap
- `crash` or `x`: Crash cymbal
- `tom` or `t`: Tom drum
### Output Directory
By default, WAV files are saved to the current directory. You can specify a custom output directory:
```javascript
// Save to a specific folder
beatmaker.setOutputDir('my-beats'); // Creates 'my-beats' folder if needed
// Relative paths
beatmaker.setOutputDir('./output/drums'); // Save to output/drums
// Absolute paths
beatmaker.setOutputDir('/home/user/music'); // Linux/macOS
beatmaker.setOutputDir('C:\\Music\\Beats'); // Windows
// Reset to default (current directory)
beatmaker.setOutputDir(null);
```
The directory will be created automatically if it doesn't exist.
## Examples
### Electronic Dance Beat
```javascript
const SimpleBeatmaker = require('simple-beatmaker');
const beatmaker = new SimpleBeatmaker();
beatmaker
.setBPM(130)
.setDrumSet('electronic')
.usePreset('electronic-dance')
.play(4, 'dance-track.wav');
```
### Custom Funk Pattern
```javascript
const SimpleBeatmaker = require('simple-beatmaker');
const beatmaker = new SimpleBeatmaker();
const funkyPattern = [
[
['kick'], null, null, ['hihat'],
null, ['clap'], ['kick'], null, // Using clap instead of snare
null, ['hihat'], ['kick'], null,
['tom'], null, ['hihat'], ['crash'] // Tom and crash at the end
]
];
beatmaker
.setBPM(95)
.setDrumSet('vintage')
.createPattern(1, funkyPattern)
.play(8, 'funk-groove.wav');
```
### Multiple Drum Sets Demo
```javascript
const SimpleBeatmaker = require('simple-beatmaker');
const beatmaker = new SimpleBeatmaker();
// Classic version
beatmaker.setBPM(120).setDrumSet('classic').usePreset('basic-rock').play(1, 'classic.wav');
// Electronic version
beatmaker.setBPM(120).setDrumSet('electronic').usePreset('basic-rock').play(1, 'electronic.wav');
// Vintage version
beatmaker.setBPM(120).setDrumSet('vintage').usePreset('basic-rock').play(1, 'vintage.wav');
```
### Using Custom Output Directory
```javascript
const SimpleBeatmaker = require('simple-beatmaker');
const beatmaker = new SimpleBeatmaker();
// Organize beats by genre
beatmaker
.setBPM(128)
.setDrumSet('electronic')
.setOutputDir('beats/electronic') // Save to beats/electronic/ folder
.usePreset('electronic-dance')
.play(2, 'dance-beat.wav');
// Different folder for rock beats
beatmaker
.setBPM(120)
.setDrumSet('classic')
.setOutputDir('beats/rock') // Save to beats/rock/ folder
.usePreset('basic-rock')
.play(2, 'rock-beat.wav');
```
## Workflow
1. **Option A**: Use `beatmaker generate init` to create a template, then customize it
2. **Option B**: Use `beatmaker generate kick-clap` for a quick start
3. **Option C**: Write your own JavaScript file from scratch
4. **Play**: Use `beatmaker play filename.js` to execute and generate audio
## Audio Output
- **Format**: WAV (44.1kHz, 16-bit, stereo)
- **Auto-play**: Generated files open in your default audio player
- **File location**: Saved in current directory with descriptive names
## How It Works
Simple Beatmaker generates all drum sounds mathematically:
- **Kick Drum**: Low-frequency sine waves with exponential decay
- **Snare Drum**: Filtered noise mixed with tonal components
- **Hi-hat**: High-frequency filtered noise with fast decay
- **Clap**: Multiple burst noise patterns to simulate hand clapping
- **Crash Cymbal**: Complex metallic harmonics with shimmer
- **Tom Drum**: Tuned drum sounds with pitch bending
Different drum sets use different parameters and processing to create distinct sonic characters.
## Requirements
- Node.js 14.0.0 or higher
- No additional dependencies required
## License
MIT
## Contributing
Issues and pull requests welcome on GitHub!