Repository navigation
Expand file tree
/
Copy pathgenerate_track.py
More file actions
142 lines (122 loc) · 3.56 KB
/
Copy pathgenerate_track.py
File metadata and controls
142 lines (122 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#!/usr/bin/env python3
"""
Mood Machine — Generate trip-hop / downtempo tracks from the command line.
Examples
--------
# Basic usage (defaults: melancholic, 78 BPM, ~3 min)
python generate_track.py
# Customise everything
python generate_track.py --mood paranoid --bpm 85 --length 120 --seed 42
# Instrumental only (no vocals)
python generate_track.py --vocal-engine silent
# Use your own text for the spoken-word vocals
python generate_track.py --text "This is my own poem. Line two."
# Specify output directory
python generate_track.py --output ./my_tracks
"""
from __future__ import annotations
import argparse
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
p = argparse.ArgumentParser(
prog="generate_track.py",
description="Mood Machine — trip-hop / downtempo music generator",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=__doc__,
)
p.add_argument(
"--mood",
"-m",
default="melancholic",
choices=["melancholic", "paranoid", "ethereal"],
help="Mood preset (default: melancholic)",
)
p.add_argument(
"--bpm",
"-b",
type=int,
default=None,
help="Tempo in BPM (default: from mood preset, typically 70-90)",
)
p.add_argument(
"--length",
"-l",
type=int,
default=None,
help="Target track length in seconds (default: calculated from arrangement)",
)
p.add_argument(
"--seed",
"-s",
type=int,
default=None,
help="Random seed for reproducible output",
)
p.add_argument(
"--vocal-engine",
"-v",
default="edge-tts",
choices=["edge-tts", "piper", "gtts", "pyttsx3", "silent"],
help="TTS engine for vocals (default: edge-tts)",
)
p.add_argument(
"--voice",
default=None,
choices=["headache", "spectral", "broken_radio", "clean"],
help="Vocal processing preset (default: from mood config)",
)
p.add_argument(
"--text",
"-t",
default=None,
help="Custom text for vocals (overrides generated lyrics)",
)
p.add_argument(
"--output",
"-o",
default=None,
help="Output directory (default: ./output)",
)
p.add_argument(
"--release",
"-r",
action="store_true",
default=False,
help="Package a release-ready ZIP bundle with metadata",
)
return p.parse_args(argv)
def main(argv: list[str] | None = None) -> None:
args = parse_args(argv)
# Lazy imports so --help is instant
from mood_machine.config import build_config
from mood_machine.pipeline import MoodMachinePipeline
extra = {}
if args.release:
extra["release"] = True
if args.voice:
extra["voice"] = args.voice
config = build_config(
mood=args.mood,
bpm=args.bpm,
length=args.length,
seed=args.seed,
vocal_engine=args.vocal_engine,
vocal_text=args.text,
output_dir=args.output,
extra_overrides=extra if extra else None,
)
pipeline = MoodMachinePipeline(config)
result = pipeline.generate()
# Print summary
print("\n── Generated Files ──")
for key in (
"output_path",
"mp3_path",
"instrumental_path",
"lyrics_path",
"release_zip",
"release_metadata",
):
if key in result:
print(f" {key}: {result[key]}")
if __name__ == "__main__":
main()