summaryrefslogtreecommitdiff
path: root/src/mml_composemusic_mcp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mml_composemusic_mcp')
-rw-r--r--src/mml_composemusic_mcp/server.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/mml_composemusic_mcp/server.py b/src/mml_composemusic_mcp/server.py
index 04b5546..0a09131 100644
--- a/src/mml_composemusic_mcp/server.py
+++ b/src/mml_composemusic_mcp/server.py
@@ -1,6 +1,7 @@
# MCP server exposing compose_mml tool.
import argparse
+from datetime import datetime
from pathlib import Path
from fastmcp import FastMCP
@@ -20,6 +21,19 @@ def _is_error(errors: list[ErrorDetail]) -> bool:
return any(e.severity == "error" for e in errors)
+def _generate_wav_filename() -> str:
+ """Generate a unique WAV filename based on the current timestamp.
+
+ Format: output_YYYYMMDD_HHMMSS_mmm.wav
+ Milliseconds are included to reduce the chance of collisions when
+ multiple compose requests are issued in rapid succession.
+ """
+ now = datetime.now()
+ # %f gives microseconds (6 digits); keep the first 3 for milliseconds.
+ timestamp = now.strftime("%Y%m%d_%H%M%S_") + now.strftime("%f")[:3]
+ return f"output_{timestamp}.wav"
+
+
def _split_errors(errors: list[ErrorDetail]) -> tuple[list[dict], list[dict]]:
errs = [e.to_dict() for e in errors if e.severity == "error"]
warns = [e.to_dict() for e in errors if e.severity == "warning"]
@@ -143,7 +157,7 @@ def compose_mml(
"note_sequence": note_sequence_dict,
"validation": {"errors": errors_list, "warnings": warnings_list},
}
- wav_path = OUTPUT_DIR / "output.wav"
+ wav_path = OUTPUT_DIR / _generate_wav_filename()
wav_errors = write_wav(wav_path, wave_data, sample_rate)
errors.extend(wav_errors)
errors_list, warnings_list = _split_errors(errors)