Jam Jam

org.jam-jam由 jam-jam.org 发布v0.3.1更新于 Oct 30, 2026

Turn audio, PDF, photos and text into chord sheets and manage your Jam Jam songbook with AI.

发布方自己的服务:convert.express

概览

AI 生成的概览

Jam Jam 可将音频、PDF、照片和文本转成和弦谱,并让助手管理 Jam Jam 歌本、歌单、分轨与母带处理。

可以做什么
  • 查询账户权限与剩余额度,列出 API 当前支持的输入输出格式
  • 把本地文件或粘贴的文本转换为和弦谱、PDF、MIDI 等格式,并查询任务进度
  • 读写私人歌本:列出、查看、新建、修改和删除歌曲与歌单
  • 浏览公开个人主页、已发布歌曲与歌单,以及本账户的关注者和关注列表
  • 分离音频分轨、分析并对齐和弦与歌词、检测 AI 生成音乐、套用母带预设渲染
适用场景
适合让助手把录音、谱面或歌词文本整理成和弦谱,或在 Jam Jam 歌本中归档、编辑和整理歌曲与歌单。也适用于分轨分离、和弦歌词对齐、AI 音乐检测和母带处理等音频工作。
运行要求
以本地 stdio 进程运行(npm 包),需在桌面电脑上使用。需要 Jam Jam 账户,并通过环境变量 JAM_JAM_API_KEY 提供在账户 API 密钥设置中创建的密钥。需要能访问 Jam Jam API 的网络连接。
安装前请注意
API 密钥属于机密,可访问账户的私人歌本与配额。多个工具会写入或删除数据:歌曲和歌单可被新建、修改、删除或公开发布,任务可被取消。上传的音频和文件会发送到 Jam Jam 服务器,转换、分轨、分析和母带处理都会消耗计量配额。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Jam Jam,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

工具

42

jj_check_usage

Check quotas and what this key may do

Returns, in one call, what the calling Jam Jam identity is allowed to do and how much of each allowance is left. THREE INDEPENDENT COUNTERS, they never borrow from one another: `conversion` (10 per week on a free account, 500 per calendar month on Premium, 3 per 24h anonymous), `read` (2000 per UTC day free, 20000 Premium, spent by the notebook and social listing tools) and `write` (200 per UTC day free, 5000 Premium, spent by the notebook writing tools). Stem separation and AI music detection keep their own counters, read with jj_stems_capabilities and jj_ai_music_availability. `scopes` lists the permissions of the API key in use. Call this before a batch, and after a quota error to learn when it resets. Costs nothing itself.

无需输入参数。

jj_list_formats

List conversion formats

Lists the input and output formats actually served by the Jam Jam API right now (GET /formats), with their limits (maxBytes, maxPages, maxDurationS) and whether they require an account or Premium. Call this FIRST, before jj_convert_file or jj_convert_text, to know which output ids are valid for a given input. Pass "input" to get the exact list of possible outputs for that one input format. Needs no API key.

输入参数inputlocale

jj_convert_file

Convert a local file

Uploads a local file (path, or base64 content) to the Jam Jam API, waits for the conversion to finish, and returns the result: embedded text for small text formats (ChordPro, .lrc, .lab...), or a local file path for binary formats (PDF, MIDI, MP4...). Call jj_list_formats first to find valid "output" ids for your input. Consumes one unit of the conversion quota (10/week free, 500/month Premium, see jj_check_usage), which is a different counter from notebook reads and writes.

输入参数pathoutput必填deliveroptionsfilenamemaxWaitMsinputFormatcontentBase64

jj_convert_text

Convert pasted text or ChordPro

Sends plain text or ChordPro (pasted lyrics and chords, no file) to the Jam Jam API, waits for the conversion to finish, and returns the result: embedded text for small text formats, or a local file path for binary formats (PDF, MIDI...). Call jj_list_formats first to find valid "output" ids. Consumes one unit of the conversion quota.

输入参数text必填output必填deliveroptionsmaxWaitMsinputFormat

jj_get_job

Get a conversion job status

Fetches the current state of a conversion job by id: phase (queued/running/done/failed/cancelled), per-step progress, and the list of artifacts once done. Use this to check on a job after jj_convert_file or jj_convert_text stopped waiting for it.

输入参数id必填

jj_list_songs

List my notebook songs

Lists the songs in the calling account's PRIVATE Jam Jam notebook, page by page, oldest update first. fields="summary" (default) gives id, title, artist, key, capo, bpm, playlistIds and updatedAt; fields="full" adds the complete pivot payload (chords, lyrics, sections) and lowers the page cap to 25. Use the returned nextCursor to get the next page, and stop when it is null. Consumes one unit of the daily READ quota (2000/day free, 20000 Premium), never a conversion.

输入参数limitcursorfieldsupdatedSince

jj_get_song

Get one notebook song

Returns one song of the calling account's notebook in full: the summary fields AND `song`, the canonical pivot payload (sections, lines, chords with their offsets, lyrics, detectedKey, metadata). That payload is exactly what jj_create_song and jj_update_song accept, so reading then writing back is a copy, not a translation. An unknown id and an id belonging to another account both return the same not-found error.

输入参数songId必填

jj_list_playlists

List my notebook playlists

Lists the playlists of the calling account's notebook. Playlists are FLAT and allow multi-membership: `songIds` is the ORDERED list of song ids, and one song can appear in several playlists. Same cursor pagination and same updatedSince incremental filter as jj_list_songs. Consumes one unit of the daily read quota.

输入参数limitcursorupdatedSince

jj_get_playlist

Get one notebook playlist and its songs

Returns one playlist of the calling account's notebook with its songs in summary form, in playlist order, paginated by the same opaque cursor. A song the playlist still references but that has since been deleted from the notebook is simply skipped.

输入参数limitcursorplaylistId必填

jj_create_song

Add a song to my notebook

Adds a song to the calling account's PRIVATE notebook. `song` is the canonical pivot payload: exactly the object returned by jj_get_song (`song`) or by a conversion whose output is "songbook", so converting then filing is a copy with no transformation. The id is DERIVED, never random: `song.id` if given, otherwise an "artist-title" slug. That means posting the same song twice REPLACES it instead of creating a duplicate, and it is also how you rewrite a song wholesale (read it with jj_get_song, edit the payload, post it back with its id). Adding NEVER publishes anything on the public profile. Consumes one unit of the daily WRITE quota (200/day free, 5000 Premium).

输入参数song必填publishplaylistIds

jj_update_song

Change a notebook song

Changes some fields of one song of the calling account's notebook. Only the fields you pass move; a field set to null erases its value. `key` is the DISPLAYED key ("G", "Am"). `playlistIds` is the complete target membership, so it is idempotent. `publish: true` puts the song on the account's public profile and requires `publishDeclaration` the first time, plus a public username; `publish: false` removes it and has no conditions. Publishing is a deliberate act by the account holder: never publish unless they asked. To rewrite lyrics, chords or structure, use jj_create_song with the song's id instead.

输入参数bpmkeycapotitleartistsongId必填ifMatchpublishplaylistIdspublishDeclaration

jj_delete_song

Delete a notebook song

Deletes a song from the calling account's notebook. Idempotent: deleting twice succeeds twice, and an unknown id succeeds too (saying "no such song" would leak whether it exists in someone else's notebook). Side effects are the same as deleting in the app: the song leaves all its playlists, its published copy disappears from the profile, and accounts that had imported it are notified. This cannot be undone from the API: confirm with the person before calling it.

输入参数songId必填

jj_create_playlist

Create a notebook playlist

Creates a playlist in the calling account's notebook. Playlists are flat and allow multi-membership: a song can be in several of them. `songIds` is the ordered content and every id must be a live song of this account. Consumes one unit of the daily write quota.

输入参数name必填songIdscoverEmoji

jj_update_playlist

Rename, re-cover or reorder a playlist

Changes one or more fields of a playlist: `name`, `coverEmoji` (null removes it), and `songIds`, which REPLACES the whole content and its order. Only the fields you pass move. To reorder, read the playlist with jj_get_playlist first and send the full list back in the new order.

输入参数nameifMatchsongIdscoverEmojiplaylistId必填

jj_delete_playlist

Delete a notebook playlist

Deletes a playlist, and ONLY the playlist: its songs stay in the notebook and in their other playlists. Idempotent, and an unknown id succeeds too. If the playlist was published on the profile, that published copy disappears.

输入参数playlistId必填

jj_get_profile

Get a public profile card

Returns the profile card of a Jam Jam account designated by its public @handle, seen from the calling account: display name, bio, avatar, visibility (public/private), follower and following counts, and `relation` (none / following / follower / mutual / requested / self). A PRIVATE account the caller does not follow returns a closed card without bio or counts. An unknown handle returns not-found. Jam Jam is a host: this never ranks or recommends anyone, and never exposes somebody else's audience figures.

输入参数handle必填

jj_list_profile_songs

List songs published by an account

Lists the songs an account has chosen to publish on its profile, newest first, with cursor pagination. `hasAudio` and `audioPlayable` are only ever true between accounts that follow each other MUTUALLY: without that link the very existence of a backing track is withheld, and no endpoint serves audio at all. A private account you do not follow refuses the call; an unknown handle returns not-found. Consumes one unit of the daily read quota.

输入参数limitcursorhandle必填

jj_list_profile_playlists

List playlists published by an account

Lists the playlists an account has published on its profile. Same visibility rules as jj_list_profile_songs. `songCount` already counts only what the caller is allowed to see: a published playlist hides the songs its author did not publish.

输入参数limitcursorhandle必填

jj_list_followers

List the accounts that follow me

Lists the calling account's own followers, newest first. status="requested" lists the follow requests it has not accepted yet. Only the caller's own relations are readable; reading somebody else's followers is not offered by this API.

输入参数limitcursorstatus

jj_list_following

List the accounts I follow

Lists the accounts the calling account follows, newest first. status="requested" lists the requests it has sent to private accounts and that are still pending. Following and un-following are done in the Jam Jam application, never by API.

输入参数limitcursorstatus

jj_stems_capabilities

Stem separation: availability, limits and quota

Reports whether stem separation is available right now (GET /stem-tool/capabilities), the models this account may use ("fast" and "quality"), the file formats ("mp3", "flac"), the maximum duration and upload size, how long results are kept, and the remaining quota with its reset time (`quota.fast` and `quota.quality`, `resetsAt` in epoch milliseconds, UTC). Call it before jj_stems_separate. Costs no quota (only the read rate limit, 240 per minute). An API key must belong to a Premium account.

无需输入参数。

jj_stems_separate

Separate a song into stems

Uploads a local audio file (path, or base64 content) and starts its separation into vocals + instrumental (stems=2) or vocals + drums + bass + other (stems=4) (POST /stem-tool/jobs). Asynchronous and slow (minutes, up to hours for a long file): by default this returns at once with the job, then follow it with jj_stems_get_job and fetch the files with jj_stems_get_file; pass maxWaitMs to wait for a short file instead. Needs the stems:write scope and an API key from a Premium account (403 otherwise). Limits on Premium: a file of at most 1 h 30 and under 2 GB (5 minutes and 100 MB without Premium). Quotas, in UTC days and calendar months, with one pair of counters per model: "fast" 10 jobs/day and 100/month (10800 s of audio/day, 54000 s/month), "quality" 2 jobs/day and 10/month (5400 s/day, 18000 s/month). Only one separation can run at a time per account. A 429 states when the counter resets; a 413 means the file is too large or too long. Stems come as MP3 320 kb/s by default, or as FLAC 24-bit with format="flac" (lossless, about 4 times larger). Check jj_stems_capabilities first.

输入参数pathmodelstemsformatfilenamemaxWaitMscontentBase64

jj_stems_get_job

Get a stem separation status

Fetches the state of one of your separations by id (GET /stem-tool/jobs/{id}): state (uploading, queued, running, saving, done, failed, cancelled, expired), queue position, processed seconds against duration, time estimates, and, once done, the names of the stems available. A job unknown or belonging to another account answers the same 404. Costs no quota (read rate limit, 240 per minute): poll no faster than every few seconds.

输入参数id必填

jj_stems_list_jobs

List recent stem separations

Lists your recent separations, newest first, 30 per page (GET /stem-tool/jobs). Use it to find a job id again, or to see whether one is still running before starting another (only one can run at a time). Pass the returned "next" as "before" for the next page. Costs no quota (read rate limit).

输入参数before

jj_stems_get_file

Get a separated stem

Fetches one result file of a finished separation (GET /stem-tool/jobs/{id}/files/{name}): a stem (vocals, instrumental, drums, bass, other, depending on the number of stems chosen; .mp3, or .flac when the job has format "flac") or all of them as stems.zip. By default the file is downloaded and its local path is returned; with download=false only the signed link is returned, valid for about 60 seconds. Files are kept 24 hours after the separation (410 afterwards); the job must be in state "done" (409 otherwise). Costs no quota (read rate limit).

输入参数id必填name必填download

jj_stems_cancel_job

Cancel a stem separation

Cancels one of your own separations that is still uploading, queued or running (DELETE /stem-tool/jobs/{id}). Needs the stems:write scope. Only call it when the user asked to stop that separation. Costs no quota. An unknown id, or a job of another account, answers 404.

输入参数id必填

jj_audio_analyze

Queue an audio file for chord and lyrics analysis

Uploads a local audio file (path, or base64 content) to the Jam Jam server queue so that its chords and lyrics are analysed, then automatically aligned, for a song of YOUR notebook (POST /audio). Same queue as the Jam Jam app. "songId" must already exist in the caller's notebook (see jj_list_songs), otherwise 404. Needs an account and the audio:write scope. It returns at once with a job: follow it with jj_queue_get_job. Idempotent per (account, song, file content): sending the same file again returns the same job with reused=true and consumes nothing. Quota: counter "audio-analysis", 15 analyses per ISO week on a free account (resets Monday 00:00 UTC), no limit on Premium; at most 50 jobs may wait per account. Errors: 413 file too large, 415 not audio, 429 quota or queue full.

输入参数pathsongId必填filenamecontentBase64

jj_queue_list

List the audio analysis queue

Lists the caller's audio analysis jobs in three groups (GET /queue): "active" (running), "queued" (waiting, with "rank" = real service order) and "done" (finished, failed or cancelled in the last 7 days). Needs an account and the queue:read scope. Costs no quota.

无需输入参数。

jj_queue_get_job

Get an audio analysis job

Fetches one job of the caller's audio queue by id (GET /queue/{id}): status (queued, active, done, failed, cancelled), stage (analyze, align), per-step status, progress and rank. An unknown id and a job of another account answer the same 404. Needs the queue:read scope. Costs no quota.

输入参数id必填

jj_queue_cancel_job

Cancel an audio analysis job

Cancels one job of the caller's own audio queue (DELETE /queue/{id}). The unit is refunded ONLY if the analysis had not completed yet; during alignment, the analysis already delivered is kept, without refund. 409 when the job can no longer be cancelled. Needs the audio:write scope. Only call it when the user asked to stop that job.

输入参数id必填

jj_ai_music_availability

AI music detection: availability, limits and quota

Reports whether the AI music detection is available (GET /ai-music/availability): upload size and duration limits, whether links are accepted, and the remaining daily and monthly quota with exact reset times (`quota.daily.resetsAt`, `quota.monthly.resetsAt`, epoch milliseconds, UTC). Quotas: visitor 2/day and 5/month, free account 5/day and 50/month, Premium 30/day and 300/month, shared between website, app and API keys; failures and cancellations are refunded. Call it before jj_ai_music_analyze and after a 429. Costs nothing.

无需输入参数。

jj_ai_music_analyze

Analyse a track for AI music signals

Starts an AI music detection (POST /ai-music/jobs) on a local audio file (path, or base64 content: 100 MB and 600 seconds at most), OR on exactly one link: "url" (Spotify track link), "spotifyTrackId", "isrc" or "audioUrl" (direct audio link; YouTube is not supported; a Spotify or ISRC source may only provide an excerpt, see result.primary.audioSource). Links only work when jj_ai_music_availability reports links=true. Asynchronous: returns at once with a job (pass maxWaitMs to wait), then follow it with jj_ai_music_get_job. One unfinished analysis per account at a time (409), results kept 90 days, no audio kept. Needs the audio:write scope. Consumes one unit of the ai-music counter (free 5/day and 50/month, Premium 30/day and 300/month, UTC; failures refunded); a 429 states when it resets, a 413 means the file is too large or too long. The report is an aggregated index of signals, not a probability and not proof of origin: present it as such.

输入参数urlisrcpathaudioUrlfilenamemaxWaitMscontentBase64spotifyTrackId

jj_ai_music_current

Find my current AI music analysis

Returns the caller's current or most recent AI music analysis, or null when there is none (GET /ai-music/jobs). Use it to find the id of a running analysis, since only one unfinished analysis per account can exist. Needs the queue:read scope. Costs no quota.

无需输入参数。

jj_ai_music_get_job

Get an AI music analysis and its report

Fetches one AI music analysis by id (GET /ai-music/jobs/{id}): state (uploading, queued, running, cancelling, done, failed, cancelled), progress, queue position and, once done, the report in "result" (score 0 to 100, verdict signals-detected / few-signals / inconclusive, per-detector windows, and for the v3 report the classification human / processed-ai / pure-ai). The report is an aggregated index of signals, not a probability and not proof of origin: present it as such. A job of another account answers 404. Needs the queue:read scope. Costs no quota.

输入参数id必填

jj_ai_music_history

List my AI music analyses of the last 90 days

Lists the caller's own analyses of the last 90 days, newest first, 30 per page (GET /ai-music/history): source label (file name or link), dates, state and report, never any audio. Needs an account and the queue:read scope. Pass the returned "nextBefore" as "before" for the next page. Costs no quota.

输入参数before

jj_ai_music_cancel_job

Cancel an AI music analysis

Cancels the caller's own AI music analysis and deletes its temporary files (DELETE /ai-music/jobs/{id}). The quota unit is refunded. Needs the audio:write scope. Only call it when the user asked to stop that analysis.

输入参数id必填

jj_mastering_capabilities

Mastering: limits, setting ranges, targets and render quota

Reports the live contract of the Mastering engine (GET /mastering/capabilities): for each of the eight modules the unit, range, step, neutral and initial value, the loudness targets, the built-in presets (builtin:balanced, ... with their full settings, a good starting point for a new preset), the limits (200 MB, 10 minutes, 50 presets of 60 characters), the validation tolerance, whether THIS account may render through the API (`renderAllowed`: any account with mastering:write) and the render quota balance. Call it before jj_create_mastering_preset or jj_master_audio with inline settings. Needs no scope and costs nothing.

无需输入参数。

jj_list_mastering_presets

List Mastering presets

Lists the Mastering presets saved on the account, newest first (GET /mastering/presets), with their full settings, plus the ids of the read-only built-in presets (builtin:balanced, ...) which are valid as the `preset` of jj_master_audio. No pagination: an account keeps 50 presets at most. Open to any account, free or Premium. Counts one unit of the daily read quota.

无需输入参数。

jj_create_mastering_preset

Create a Mastering preset

Saves a named Mastering preset on the account (POST /mastering/presets): a name of 1 to 60 characters, unique among the account presets, and the settings (all eight modules with value and enabled, a loudness target, normalize). Each value must be within its range and on its step: read them with jj_mastering_capabilities, or copy the settings of a built-in preset and change a few values. The API answers 422 with the path of every rejected field when the settings are invalid, 409 when the name is taken or the 50-preset cap is reached. Open to any account, free or Premium. Counts one unit of the daily write quota. Only call it when the user asked to save a preset.

输入参数name必填settings必填

jj_master_audio

Master an audio file with a preset

Uploads a local audio file (path, or base64 content) and renders it with a Mastering preset on the server (POST /mastering/jobs): the same engine as the Jam Jam web tool. Pass EXACTLY ONE of `preset` (a preset id from jj_list_mastering_presets, or builtin:<id>) and `settings` (inline settings, see jj_create_mastering_preset). The result is a 48 kHz WAV (`format` wav-pcm16 by default, wav-pcm24, or wav-f32). Asynchronous: by default this returns at once with the job, then follow it with jj_mastering_get_job; pass maxWaitMs to wait, and a render that finishes in time is downloaded in the same call (`file`). Open to any account (3 renders per ISO week for a free account, 429 quota-exhausted beyond; unlimited for Premium) and needs the mastering:write scope. Limits: a file of at most 200 MB and 10 minutes, one or two channels; one render runs and three wait per account. The render consumes the Mastering render counter (shared with the Jam Jam app), counted at submission; a failed or cancelled render is refunded. Results are kept 24 hours. Only call it when the user asked to master that file.

输入参数pathformatpresetfilenamesettingsmaxWaitMscontentBase64

jj_mastering_get_job

Get a Mastering render status

Fetches one of your renders by id (GET /mastering/jobs/{id}): status (queued, decoding, analyzing, rendering, done, failed, cancelled, expired), progress, queue position, a copy of the settings used and, once done, the loudness measures before and after (`report`) and the sha256 of the result. With download=true on a finished render, the mastered WAV (GET /mastering/jobs/{id}/result, free to repeat) is downloaded to a local file and its path returned. A render unknown or belonging to another account answers the same 404; results are kept 24 hours (410 afterwards). Costs no quota (read rate limit): poll no faster than every few seconds.

输入参数id必填download

jj_mastering_cancel_job

Cancel a Mastering render

Cancels one of your own renders and deletes its files (DELETE /mastering/jobs/{id}). The render quota already consumed is refunded when the render was not finished. Needs the mastering:write scope. Only call it when the user asked to stop that render. An unknown id, or a render of another account, answers 404.

输入参数id必填

版本历史

3
  1. v0.3.1最新Oct 30, 2026
  2. v0.2.2Oct 19, 2026
  3. v0.2.1Oct 15, 2026

评分

已满足适用检查项的 65%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分

    请声明包含 README 的 GitHub 仓库,或在 OAuth 受保护资源元数据中提供 resource_documentation。

  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。

其他 Convert 集成