o
    e                     @   s   d 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mZm	Z	m
Z
mZ G dd deZG dd	 d	eZG d
d deZG dd deZG dd deZG dd deZG dd deZdS )aO  
Each generator will return float samples from -1.0 to 1.0, which can be 
converted to actual audio with 8, 16, 24, or 32 bit depth using the
SiganlGenerator.to_audio_segment() method (on any of it's subclasses).

See Wikipedia's "waveform" page for info on some of the generators included 
here: http://en.wikipedia.org/wiki/Waveform
    N   )AudioSegment)db_to_floatget_frame_widthget_array_typeget_min_max_valuec                   @   s(   e Zd ZdddZdddZd	d
 ZdS )SignalGeneratorD     c                 C   s   || _ || _d S N)sample_rate	bit_depth)selfr   r    r   @D:\Projects\ConvertPro\env\Lib\site-packages\pydub/generators.py__init__   s   
zSignalGenerator.__init__     @@        c           	         s   t | j\}t| j}t| j}t| t| j|d  } fdd|  D }t	|d|}t

||}z| }W n   | }Y t|d|| j|ddS )z
        Duration in milliseconds
            (default: 1 second)
        Volume in DB relative to maximum amplitude
            (default 0.0 dBFS, which is the maximum value)
        r   c                 3   s     | ]}t |   V  qd S r   )int).0valZgainmaxvalr   r   	<genexpr>+   s    z3SignalGenerator.to_audio_segment.<locals>.<genexpr>r   r   )Zchannelssample_widthZ
frame_rateZframe_width)datametadata)r   r   r   r   r   r   r   generate	itertoolsislicearraytobytesZtostringr   )	r   durationvolumeminvalr   Z
array_typeZsample_countZsample_datar   r   r   r   to_audio_segment   s$   



z SignalGenerator.to_audio_segmentc                 C   s   t d)NzuSignalGenerator subclasses must implement the generate() method, and *should not* call the superclass implementation.)NotImplementedErrorr   r   r   r   r   <   s   zSignalGenerator.generateN)r	   r
   )r   r   )__name__
__module____qualname__r   r%   r   r   r   r   r   r      s    

r   c                       s$   e Zd Z fddZdd Z  ZS )Sinec                    s    t t| jdi | || _d S Nr   )superr+   r   freqr   r.   kwargs	__class__r   r   r   B   s   
zSine.__init__c                 c   s8    | j d tj | j }d}	 t|| V  |d7 }q)N   r   Tr   )r.   mathpir   sin)r   Zsine_ofsample_nr   r   r   r   F   s   zSine.generater(   r)   r*   r   r   __classcell__r   r   r1   r   r+   A   s    r+   c                       &   e Zd Zd fdd	Zdd Z  ZS )Pulse      ?c                    &   t t| jdi | || _|| _d S r,   )r-   r;   r   r.   
duty_cycler   r.   r>   r0   r1   r   r   r   P      
zPulse.__init__c                 c   sF    d}| j t| j }|| j }	 || |k rdV  ndV  |d7 }q)Nr   T      ?g      r   r   floatr.   r>   )r   r7   cycle_lengthZpulse_lengthr   r   r   r   U   s   
zPulse.generate)r<   r8   r   r   r1   r   r;   O       r;   c                          e Zd Z fddZ  ZS )Squarec                    $   d|d< t t| j|fi | d S Nr<   r>   )r-   rG   r   r/   r1   r   r   r   f      zSquare.__init__r(   r)   r*   r   r9   r   r   r1   r   rG   e       rG   c                       r:   )SawtoothrA   c                    r=   r,   )r-   rM   r   r.   r>   r?   r1   r   r   r   m   r@   zSawtooth.__init__c                 c   sr    d}| j t| j }|| j }|}|| }	 || }||k r)d| | d V  ndd||  |  V  |d7 }q)Nr   Tr3   rA   r   rB   )r   r7   rD   ZmidpointZascend_lengthZdescend_lengthZcycle_positionr   r   r   r   r   s   
zSawtooth.generate)rA   r8   r   r   r1   r   rM   l   rE   rM   c                       rF   )Trianglec                    rH   rI   )r-   rN   r   r/   r1   r   r   r      rJ   zTriangle.__init__rK   r   r   r1   r   rN      rL   rN   c                   @   s   e Zd Zdd ZdS )
WhiteNoisec                 c   s    	 t   d d V  q)NTr3   rA   )randomr'   r   r   r   r      s   zWhiteNoise.generateN)r(   r)   r*   r   r   r   r   r   rO      s    rO   )__doc__r4   r    r   rP   Zaudio_segmentr   utilsr   r   r   r   objectr   r+   r;   rG   rM   rN   rO   r   r   r   r   <module>   s    		)