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.40.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.40-py3-none-any.whl (99.4 MB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: midisim-25.12.40.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.40.tar.gz
Algorithm Hash digest
SHA256 01c79a0b9a38cdbf6b8de900cabae3f9efbdb2e27b87d78638d0dc8c4ce02c28
MD5 c8c60d9872cbf635f8e260d354355c54
BLAKE2b-256 f623f245a65bdafd92b0d698e0ed243bfbf246d1ff89cffcc150f17be80a6007

See more details on using hashes here.

File details

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

File metadata

  • Download URL: midisim-25.12.40-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.40-py3-none-any.whl
Algorithm Hash digest
SHA256 7c2772f4f5e878949c48835bb1c902b19e2deefcc5ca89041d1061da5b915189
MD5 59f664b50dd388b0bb9e484f63311226
BLAKE2b-256 45052fea3327dd58cc086c2418248f39fed96620fdbe7e072a9ab3e716600767

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