Skip to main content

Calculate, search, and analyze MIDI-to-MIDI similarity at scale

Project description

midisim

Calculate, search, and analyze MIDI-to-MIDI similarity at scale

midisim

Installation

midisim PyPI package (for general use)

!pip install -U midisim

x-transformers 2.3.1 (for raw/custom tasks)

!pip install x-transformers==2.3.1

Basic use guide

General use example

# Import main midisim module
import midisim

# Download sample pre-computed embeddings corpus
emb_path = midisim.download_embeddings()

# Load downloaded embeddings corpus
corpus_midi_names, corpus_emb = midisim.load_embeddings()

# Download main pre-trained midisim model
model_path = midisim.download_model()

# Load midisim model
model, ctx, dtype = midisim.load_model(model_path)

# Load source MIDI
input_toks_seqs = midisim.midi_to_tokens('Come To My Window.mid')

# Compute source/query embeddings
query_emb = midisim.get_embeddings_bf16(model, input_toks_seqs)

# Calculate cosine similarity between source/query MIDI embeddings and embeddings corpus
idxs, sims = midisim.cosine_similarity_topk(query_emb, corpus_emb)

# Convert the results to sorted list with transpose values
idxs_sims_tvs_list = midisim.idxs_sims_to_sorted_list(idxs, sims)

# Print corpus matches (and optionally) convert the final result to a handy dict
midisim.print_sorted_idxs_sims_list(idxs_sims_tvs_list, corpus_midi_names, return_as_list=True)

Raw/custom use example

import torch
from x_transformers import TransformerWrapper, Encoder

# Original model hyperparameters
SEQ_LEN = 3072

MASK_IDX     = 384 # Use this value for masked modelling
PAD_IDX      = 385 # Model pad index
VOCAB_SIZE   = 386 # Total vocab size

MASK_PROB    = 0.15 # Original training mask probability value (use for masked modelling)

DEVICE = 'cuda' # You can use any compatible device or CPU
DTYPE  = torch.bfloat16 # Original training dtype

# Official main midisim model checkpoint name
MODEL_CKPT = 'midisim_small_pre_trained_model_2_epochs_43117_steps_0.3148_loss_0.9229_acc.pth'

# Model architecture using x-transformers
model = TransformerWrapper(
    num_tokens = VOCAB_SIZE,
    max_seq_len = SEQ_LEN,
    attn_layers = Encoder(
        dim   = 512,
        depth = 8,
        heads = 8,
        rotary_pos_emb = True,
        attn_flash = True,
    ),
)

model.load_state_dict(torch.load(MODEL_CKPT))

model.to(DEVICE)
model.eval()

# Original training autoxast setup
autocast_ctx = torch.amp.autocast(device_type=DEVICE, dtype=DTYPE)

Creating custom MIDI corpus embeddings

# Load main midisim module
import midisim

# Import helper modules
import os
import tqdm

# Call included TMIDIX module through midisim to create MIDI files list
custom_midi_corpus_file_names = midisim.TMIDIX.create_files_list(['./custom_midi_corpus_dir/'])

# Create two lists: one with MIDI corpus file names 
# and another with MIDI corpus tokens representations suitable for embeddings generation
midi_corpus_file_names = []
midi_corpus_tokens = []

for midi_file in tqdm.tqdm(custom_midi_corpus_file_names):
    midi_corpus_file_names.append(os.path.splitext(os.path.basename(midi_file))[0])
    
    midi_tokens = midisim.midi_to_tokens(midi_file, transpose_factor=0, verbose=False)[0]
    midi_corpus_tokens.append(midi_tokens)

# Load main midisim model
model, ctx, dtype = midisim.load_model(verbose=False)

# Generate MIDI corpus embeddings
midi_corpus_embeddings = midisim.get_embeddings_bf16(model, midi_corpus_tokens)

# Save generated MIDI corpus embeddings and MIDI corpus file names in one handy NumPy file
midisim.save_embeddings(midi_corpus_file_names,
                        midi_corpus_embeddings,
                        verbose=False
                       )

# You can now use this saved custom MIDI corpus file with midisim.load_embeddings
# and the rest of the pipeline outlined in basic use section.

Project Los Angeles

Tegridy Code 2025

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

midisim-25.12.41.tar.gz (99.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

midisim-25.12.41-py3-none-any.whl (99.4 MB view details)

Uploaded Python 3

File details

Details for the file midisim-25.12.41.tar.gz.

File metadata

  • Download URL: midisim-25.12.41.tar.gz
  • Upload date:
  • Size: 99.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for midisim-25.12.41.tar.gz
Algorithm Hash digest
SHA256 9dd5ab5fcc15f62ca94114a6ff1836395a5766b29504a38eef84a8695bb69ef0
MD5 fb500db0ebfbb6764251906ed3f9ff37
BLAKE2b-256 cf15679403c7c43cb6b802026e769a8d7a3e69652f47fbf2442308812c492fea

See more details on using hashes here.

File details

Details for the file midisim-25.12.41-py3-none-any.whl.

File metadata

  • Download URL: midisim-25.12.41-py3-none-any.whl
  • Upload date:
  • Size: 99.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for midisim-25.12.41-py3-none-any.whl
Algorithm Hash digest
SHA256 1439ff8ac5cea4cd69f154b736a0738f26e2df62198ec845d306dea4c392fe4c
MD5 906574bdf64bc20e189e9a9ef9a8c284
BLAKE2b-256 ef88ed29d533f69c2bdff722aa42321d04898c11ce6c219f66acbe8ee6a07572

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page