Metadata-Version: 2.1
Name: pygmidi
Version: 4.0.1
Summary: Python General MIDI representation for symbolic music data analysis
Home-page: http://github.com/LESSSE/pygmidi
Author: Luís Espírito Santo (LESSSE)
Author-email: luis.a.santo@tecnico.ulisboa.pt
License: UNKNOWN
Keywords: general,midi,dataset,music,symbolic,pygmidi
Platform: UNKNOWN
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: License :: Free for non-commercial use
Classifier: Programming Language :: Python :: 2.7
Classifier: Intended Audience :: Education
Classifier: Topic :: Artistic Software
Classifier: Topic :: Multimedia :: Sound/Audio :: MIDI
Description-Content-Type: text/markdown
Requires-Dist: six (<2.0,>=1.0.0)
Requires-Dist: numpy (<2.0,>=1.10.0)
Requires-Dist: scipy (<2.0,>=1.0.0)
Requires-Dist: mido
Requires-Dist: pandas
Requires-Dist: pyfluidsynth
Requires-Dist: scikit-learn
Requires-Dist: six (>=1.0.0)
Requires-Dist: matplotlib
Requires-Dist: pypianoroll
Requires-Dist: python3-midi
Requires-Dist: pretty-midi
Requires-Dist: MIDIUtil
Provides-Extra: gif
Requires-Dist: moviepy (>=0.2.3.2) ; extra == 'gif'
Provides-Extra: plot
Requires-Dist: matplotlib (>=1.5) ; extra == 'plot'

<img src="./images/pygmidi-h.png" alt="pygmidi logo" height="100">

# pygmidi

### A general representation for MIDI files for symbolic music data-driven approaches

MIDI files are a common way to represent symbolic music. pygmidi (Python General Midi) is a facade for the most used python packages focused on midi files manipulation, so it can used transparently. For now, it includes:
* [midi Pattern](https://github.com/vishnubob/python-midi)
* [PrettyMidi](https://github.com/craffel/pretty-midi)
* [pianoroll Multitrack](https://salu133445.github.io/pypianoroll/)
* [MidiFile](https://mido.readthedocs.io/en/latest/midi_files.html)
* MidiArray: a new minimalistic representation that uses only an array and a list of instruments, allowing to easily have a tensor representation of the midi file aimming machine learning purposes

**New Features:**
* Methods to automatically orchestrate and slice midi files to help pre-processing midi data
* `sparray` is a sparse array representation for efficient disk saving purposes with which you may save and load tensor representated midi files for both time and space efficiency 
* Set of evaluation tools for variable sized sequences of pianoroll blocks and metrics for music evaluation 
* A lot of different ways to export to jpg, gif and wav formats (**comming exporting to PDF**)

## Instalation
____________________________________________________________

```
$ git clone https://github.com/LESSSE/pygmidi
$ cd pygmidi
$ pip install . --user
```

## Typical Use
____________________________________________________________

```
    #!/usr/bin/env python

    from pygmidi import pygmidi
    g = pygmidi("path_to_midifile.mid")

    g.transpose(-1)
    g.to_npz("new_npz_path")
    g.to_gif("new_gif_path")
```


## For processing midi files in a directory
____________________________________________________________

```
    #!/usr/bin/env python

    from pygmidi import pygmidi,utils,midiarray
    from glob import glob
    from os import path

    programs_map = {('woods',False): 0,
                ('brass',False): 1,
                ('percussion',True): 2,
                ('timpani',False): 3,
                ('chromatic_percussion',False): 4,
                ('voices', False): 5,
                ('guitars',False): 6,
                ('basses',False): 6,
                ('strings',False): 6,
                ('keyboards',False): 7}

    #Tracks_map is the configuration for the new orchestrated tracks
    tracks_map = [{'program':71,'is_drum':False,"name":"woods"}, #woods
                {'program':60,'is_drum':False,"name":"brass"}, #brass
                {'program':0,'is_drum':True,"name":"percussion"},  #percussion
                {'program':47,'is_drum':False,"name":"timpani"}, #timpani
                {'program':14,'is_drum':False,"name":"tubular bells"}, #tubular bells
                {'program':52,'is_drum':False,"name":"voices"}, #voices
                {'program':48,'is_drum':False,"name":"strings"}, #strings
                {'program':1,'is_drum':False,"name":"piano"}] #piano

    for i in glob('{}/*.mid'.format("midi")):
         a = pygmidi.process(songs[0],
                  i_to_t=programs_map,
                  t_to_i=tracks_map,
                  ticks=4*24*4,
                  transpose=(0,1))
         utils.sparray.save("{}/{}.npz".format("npz",path.splitext(path.basename(i))[0]),a)
```




