U
    9%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   O/var/www/html/Darija-Ai-API/env/lib/python3.8/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 nX 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tobytes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d S )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f | || _d S r   )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d S )N   r   r   )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                       s&   e Zd Zd fdd	Zdd Z  ZS )Pulse      ?c                    s"   t t| jf | || _|| _d S r   )r-   r:   r   r.   
duty_cycler   r.   r<   r0   r1   r   r   r   P   s    zPulse.__init__c                 c   sF   d}| j t| j }|| j }|| |k r2dV  ndV  |d7 }qd S )Nr         ?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   s   r:   c                       s   e Zd Z fddZ  ZS )Squarec                    s    d|d< t t| j|f| d S Nr;   r<   )r-   rB   r   r/   r1   r   r   r   f   s    zSquare.__init__r)   r*   r+   r   r9   r   r   r1   r   rB   e   s   rB   c                       s&   e Zd Zd fdd	Zdd Z  ZS )Sawtoothr>   c                    s"   t t| jf | || _|| _d S r   )r-   rE   r   r.   r<   r=   r1   r   r   r   m   s    zSawtooth.__init__c                 c   sr   d}| j t| j }|| j }|}|| }|| }||k rNd| | d V  ndd||  |  V  |d7 }q*d S )Nr   r3   r>   r   r?   )r   r7   rA   ZmidpointZascend_lengthZdescend_lengthZcycle_positionr   r   r   r   r   s    
zSawtooth.generate)r>   r8   r   r   r1   r   rE   l   s   rE   c                       s   e Zd Z fddZ  ZS )Trianglec                    s    d|d< t t| j|f| d S rC   )r-   rF   r   r/   r1   r   r   r      s    zTriangle.__init__rD   r   r   r1   r   rF      s   rF   c                   @   s   e Zd Zdd ZdS )
WhiteNoisec                 c   s   t   d d V  q d S )Nr3   r>   )randomr(   r   r   r   r      s    zWhiteNoise.generateN)r)   r*   r+   r   r   r   r   r   rG      s   rG   )__doc__r4   r    r   rH   Zaudio_segmentr   utilsr   r   r   r   objectr   r,   r:   rB   rE   rF   rG   r   r   r   r   <module>   s   		)