> ## Documentation Index
> Fetch the complete documentation index at: https://docs.musicgpt.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Audio to MIDI

> Processes an audio file and converts it into a MIDI file. Optionally generates a sonified .wav and/or a CSV of note events. This request is handled asynchronously.

Convert an audio file into a MIDI file using AI-driven audio analysis and transcription.

The **Audio to MIDI** endpoint processes audio files to generate MIDI sequences. It can optionally create a sonified `.wav` file of the MIDI output and export note events into a `.csv` file for further analysis or editing.
Ideal for music production, remixing, and advanced audio content creation.

***

## Endpoint

```http theme={null}
POST /audio_to_midi
```

This is the primary endpoint for initiating audio-to-MIDI conversion tasks.

***

## Sample Output

Generated MIDI and optional outputs from a sample audio file:

<a href="https://lalals.s3.amazonaws.com/AudioToMidi/f5b563e5-e414-47ec-989b-255c74d90119.mid" target="_blank">Download MIDI(.mid)</a>

<a href="https://lalals.s3.amazonaws.com/AudioToMidi/f5b563e5-e414-47ec-989b-255c74d90119.wav" target="_blank">Download Sonified MIDI(.wav)</a>

***

## Try it Yourself

Visit the [Audio to MIDI Endpoint Explorer](/api-documentation/endpoint/audio_to_midi) to test it live. Upload an audio file, and get back the MIDI version!

***

## 🛠️ Request Parameters

| Parameter          | Type      | Required | Default | Description                                                    |
| ------------------ | --------- | -------- | ------- | -------------------------------------------------------------- |
| `audio_path`       | `String`  | ✅ Yes    | -       | The **S3 path** of the input audio file to convert.            |
| `sonify_midi`      | `Boolean` | Optional | `true`  | If `true`, generates a `.wav` file that plays the MIDI output. |
| `save_note_events` | `Boolean` | Optional | `true`  | If `true`, saves predicted note events as a `.csv` file.       |
| `webhook_url`      | `String`  | Optional | `""`    | Callback URL for asynchronous result delivery.                 |

> 💡**Note:** `audio_path` must be a valid and accessible S3 URL.

> **content-type:** multipart/form-data

***

## Sample Request

### cURL

```bash theme={null}
curl -X POST "https://api.musicgpt.com/api/public/v1/audio_to_midi" \
-H "accept: application/json" \
-H "Authorization: <api_key>" \
-d '{
  "audio_path": "s3://your-bucket/input_audio.wav",
  "sonify_midi": true,
  "save_note_events": true,
  "webhook_url": "https://yourdomain.com/webhook"
}'
```

### Python

```python theme={null}
import requests

url = "https://api.musicgpt.com/api/public/v1/audio_to_midi"
headers = {"Authorization": "<<<api key>>>"}

# Option 1: Use audio URL
payload = {
    "audio_url": "https://example.com/audio_file.wav",
    "sonify_midi": True,
    "save_note_events": True,
    "webhook_url": "https://your-webhook-url.com/callback"
}
response = requests.post(url, headers=headers, data=payload)
print(response.json())

# Option 2: Upload local audio file
payload = {
    "sonify_midi": True,
    "save_note_events": True,
    "webhook_url": "https://your-webhook-url.com/callback"
}
with open("audio.wav", "rb") as f:
    files = {"audio_file": f}
    response = requests.post(url, headers=headers, data=payload, files=files)
print(response.json())
```

> 🔐 Replace `api_key`, `audio_path`, and `webhook_url` with your own values before sending.

***

## Sample Response

### Success (200 OK)

```json theme={null}
{
  "success": true,
  "task_id": "abcdef1234567890",
  "status": "processing"
}
```

***

## Common Errors

* **400 Bad Request**: Invalid `audio_path` or missing required parameters.
* **404 Not Found**: Provided audio file not found in S3.
* **422 Unprocessable Entity**: Unsupported audio format.
* **500 Internal Server Error**: An unexpected error occurred while processing.

***

## Webhook Response

When the conversion process completes, if a `webhook_url` was provided, the system sends a POST request:

```json theme={null}
{
  "success": true, 
  "conversion_type": "Audio to MIDI", 
  "task_id": "f5b563e5-e414-47ec-989b-255c74d90119", 
  "conversion_id": "c7127f6b-e9a4-4d22-8804-d94a8521155a", 
  "midi_file_path": "https://lalals.s3.amazonaws.com/AudioToMidi/f5b563e5-e414-47ec-989b-255c74d90119.mid", 
  "sonify_file_path": "https://lalals.s3.amazonaws.com/AudioToMidi/f5b563e5-e414-47ec-989b-255c74d90119.wav", 
  "notes_file_path": "", 
  "message": "Audio to Midi Completed"
}
```

You can download your generated files using the provided URLs.

***

## Payload and Request Formation


## OpenAPI

````yaml POST /v1/audio_to_midi
openapi: 3.1.0
info:
  title: Musicgpt API
  version: 1.0.0
  description: API for retrieving conversion details by ID.
servers:
  - url: https://api.musicgpt.com/api/public
    description: Production server
security: []
paths:
  /v1/audio_to_midi:
    post:
      summary: Convert Audio to MIDI
      description: >-
        Processes an audio file and converts it into a MIDI file. Optionally
        generates a sonified .wav and/or a CSV of note events. This request is
        handled asynchronously.
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                audio_url:
                  type: string
                  description: URL of the audio file to convert to MIDI.
                  example: https://example.com/audio.mp3
                audio_file:
                  type: string
                  format: binary
                  description: Audio file to upload and process directly.
                sonify_midi:
                  type: boolean
                  default: true
                  description: >-
                    If true, generates a .wav file that sonifies the MIDI
                    output.
                save_note_events:
                  type: boolean
                  default: true
                  description: If true, saves predicted note events as a CSV file.
                webhook_url:
                  type: string
                  description: Callback URL to receive conversion results.
                  example: https://your-webhook-url.com/callback
              anyOf:
                - required:
                    - audio_url
                - required:
                    - audio_file
      responses:
        '200':
          description: MIDI conversion task initiated successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  task_id:
                    type: string
                    example: task789
                  message:
                    type: string
                    example: MIDI conversion task queued successfully
        '400':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: Missing or invalid audio_url
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: false
                  error:
                    type: string
                    example: Error during MIDI conversion
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: Python
          source: |-
            import requests

            url = "https://api.musicgpt.com/api/public/v1/audio_to_midi"
            headers = {"Authorization": "<<<api key>>>"}

            # Option 1: Use audio URL
            payload = {
                "audio_url": "https://example.com/audio_file.wav",
                "sonify_midi": True,
                "save_note_events": True,
                "webhook_url": "https://your-webhook-url.com/callback"
            }
            response = requests.post(url, headers=headers, data=payload)
            print(response.json())

            # Option 2: Upload local audio file
            payload = {
                "sonify_midi": True,
                "save_note_events": True,
                "webhook_url": "https://your-webhook-url.com/callback"
            }
            with open("audio.wav", "rb") as f:
                files = {"audio_file": f}
                response = requests.post(url, headers=headers, data=payload, files=files)
            print(response.json())
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization

````