o
    Ni!                     @   s   d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddlZddl	Z	ddl
mZ ddlZddlm  mZ ddlmZ dZdZg d	Zg d
ZdZdZG dd dejjZG dd dejjZdd Z dS )zGroove Midi Dataset (GMD).    )absolute_import)division)print_functionN)loggingzThe Groove MIDI Dataset (GMD) is composed of 13.6 hours of aligned MIDI and
(synthesized) audio of human-performed, tempo-aligned expressive drumming
captured on a Roland TD-11 V-Drum electronic drum kit.
a  
@inproceedings{groove2019,
    Author = {Jon Gillick and Adam Roberts and Jesse Engel and Douglas Eck and David Bamman},
    Title = {Learning to Groove with Inverse Sequence Transformations},
    Booktitle	= {International Conference on Machine Learning (ICML)}
    Year = {2019},
}
)afrobeat	afrocubanbluescountrydancefunkgospelhighlifehiphopjazzlatinmiddleeastern
neworleanspoppunkreggaerocksoul)z3-4z4-4z5-4z5-8z6-8zLhttps://storage.googleapis.com/magentadata/datasets/groove/groove-v1.0.0.zipzUhttps://storage.googleapis.com/magentadata/datasets/groove/groove-v1.0.0-midionly.zipc                       s"   e Zd ZdZd fdd	Z  ZS )GrooveConfigz!BuilderConfig for Groove Dataset.NT>  c                    sv   |rd| ndg}|r| d|  n| d tjdd}tt| jd
d||d| || _|| _	|| _
d	S )a  Constructs a GrooveConfig.

    Args:
      split_bars: int, number of bars to include per example using a sliding
        window across the raw data, or will not split if None.
      include_audio: bool, whether to include audio in the examples. If True,
        examples with missing audio will be excluded.
      audio_rate: int, sample rate to use for audio.
      **kwargs: keyword arguments forwarded to super.
    z%dbarfullz%dhzmidionlyz2.0.1z6New split API (https://tensorflow.org/datasets/splits)-)nameversionN )appendtfdscoreVersionsuperr   __init__join
split_barsinclude_audio
audio_rate)selfr'   r(   r)   kwargs
name_partsv2	__class__r   T/home/ubuntu/.local/lib/python3.10/site-packages/tensorflow_datasets/audio/groove.pyr%   ?   s   


zGrooveConfig.__init__)NTr   )__name__
__module____qualname____doc__r%   __classcell__r   r   r.   r0   r   <   s    r   c                	   @   sd   e Zd ZdZedddedddedddd	eddd
d	edddd	gZdd Zdd Zdd ZdS )Groovez3The Groove MIDI Dataset (GMD) of drum performances.Fz&Groove dataset without audio, unsplit.)r(   descriptionTz#Groove dataset with audio, unsplit.   z6Groove dataset without audio, split into 2-bar chunks.)r(   r'   r7   z3Groove dataset with audio, split into 2-bar chunks.   z6Groove dataset without audio, split into 4-bar chunks.c                 C   s   t jtjjdd tddD dtjjddgdt jtjjtdtjjtdt jdt jd	}| j	j
r@tjjt j| j	jd
|d< tjj| ttj|dtdS )Nc                 S   s   g | ]}d | qS )z	drummer%dr   ).0ir   r   r0   
<listcomp>|   s    z Groove._info.<locals>.<listcomp>      )namesbeatfillprimary	secondary)iddrummertypebpmtime_signaturestylemidi)dtypesample_rateaudioz#https://g.co/magenta/groove-dataset)builderr7   featureshomepagecitation)tfstringr!   rP   
ClassLabelrangeint32_TIME_SIGNATURES_PRIMARY_STYLESbuilder_configr(   Audiofloat32r)   r"   DatasetInfo_DESCRIPTIONFeaturesDict	_CITATION)r*   features_dictr   r   r0   _infow   s.   


zGroove._infoc                    s   t j|| jjrtntd t	t
}tjjt j d}t|}|D ]}||d  | q)W d   n1 s?w   Y   fdd| D S )zReturns splits.groovezinfo.csvsplitNc                    s&   g | ]\}}t jj|| d dqS ))rowsdata_dir)r   
gen_kwargs)r!   r"   SplitGenerator)r:   rd   
split_rowsrf   r   r0   r<      s    z,Groove._split_generators.<locals>.<listcomp>)ospathr&   download_and_extract_builder_configr(   _DOWNLOAD_URL_DOWNLOAD_URL_MIDI_ONLYcollectionsdefaultdictlistrS   iogfileGFilecsv
DictReaderr    items)r*   
dl_managerre   freaderrowr   rj   r0   _split_generators   s"   


zGroove._split_generatorsc              	   c   s   | j j}|D ];}|d d}tjjtj	||d d}|
 }W d    n1 s/w   Y  d }| j jrW|d sGtd|d  qtj	||d }	t|	| j j}|d |d |d	 t|d
 |d |d t|dkru|d nddd}
|s||
d< |d ur||
d< |
d |
fV  qt|d
 }t|d dd }d| | }| j j}tjjjt|}| }tt|| }t|| | }|d urt||k rt|d|t| gd}t|| d D ]X}|| || | g}t|}||d|| g |j |_ t }|!| |" |
d< |d ur1|t|d | t|d |  |
d< |
d  d| 7  < |
d |
fV  qqd S )NrJ   /midi_filenamerbaudio_filenamez"Skipping example with no audio: %srE   rF   	beat_typerH   rI   r   r8   r=    rB   )rE   rF   rG   rH   rI   rJ   rK   rN   r   <   constantz:%03d)#rn   r'   rd   rS   rt   ru   rv   rk   rl   r&   readr(   r   warning	_load_wavr)   intlenr!   r"   lazy_importspretty_midi
PrettyMIDIBytesIOget_end_timeroundnppadrV   copydeepcopyadjust_timestime_signature_changeswritegetvalue)r*   re   rf   r'   r}   split_genremidi_frK   rN   wav_pathexamplerH   beats_per_barbar_durationr)   pmtotal_duration
total_barstotal_framesr;   
time_rangepm_split
midi_splitr   r   r0   _generate_examples   sv   





zGroove._generate_examplesN)	r1   r2   r3   r4   r   BUILDER_CONFIGSrb   r~   r   r   r   r   r0   r6   Z   s:    r6   c                 C   s~   t jj| d}tjjjjj	|dd
d|}W d    n1 s$w   Y  t| tj}|dd|j   }|S )Nr   wav)formatr=   r8      )rS   rt   ru   rv   r!   r"   r   pydubAudioSegment	from_fileset_channelsset_frame_rater   arrayget_array_of_samplesastyper\   sample_width)rl   rM   audio_faudio_segmentrN   r   r   r0   r      s   r   )!r4   
__future__r   r   r   rq   r   rw   rt   rk   abslr   numpyr   tensorflow.compat.v2compatr-   rS   tensorflow_datasets.public_api
public_apir!   r^   r`   rY   rX   ro   rp   r"   BuilderConfigr   GeneratorBasedBuilderr6   r   r   r   r   r0   <module>   s.   	 