Skip to main content

Map data to sound allowing it to be interpreted it in an auditory manner

Project description

sonification

Map data to sound allowing it to be interpreted it in an auditory manner

To install: pip install sonification

Examples

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler, LabelEncoder
import simpleaudio as sa

def preprocess_dataframe(df):
    df = df.copy()
    # Normalize numerical columns
    scaler = MinMaxScaler()
    for column in df.select_dtypes(include=np.number).columns:
        df[column] = scaler.fit_transform(df[[column]])
    
    # Ensure durations are not zero
    if 'duration' in df.columns:
        df['duration'] = df['duration'] + 0.01  # Adding a small value to ensure durations are not zero
    
    # Encode categorical columns
    label_encoders = {}
    for column in df.select_dtypes(include='object').columns:
        le = LabelEncoder()
        df[column] = le.fit_transform(df[column])
        label_encoders[column] = le
    
    return df, label_encoders

def generate_tone(frequency, duration, volume, sample_rate=44100):
    t = np.linspace(0, duration, int(sample_rate * duration), False)
    wave = volume * np.sin(frequency * t * 2 * np.pi)
    return wave

def map_features_to_audio(df, pitch_col, duration_col, volume_col, sample_rate=44100):
    waveform = np.array([])
    
    for index, row in df.iterrows():
        pitch = row[pitch_col]
        duration = row[duration_col]
        volume = row[volume_col]
        
        frequency = 440 + pitch * 440  # Example: Map pitch to frequency
        wave = generate_tone(frequency, duration, volume, sample_rate)
        
        # print(f"Row {index}: pitch={pitch}, duration={duration}, volume={volume}, frequency={frequency}, wave_len={len(wave)}")
        
        waveform = np.concatenate([waveform, wave])
    
    print(f"Final waveform length: {len(waveform)}")
    return waveform, sample_rate

def save_or_return_audio(waveform, sample_rate, filepath=None):
    if filepath:
        # Normalize waveform to int16 range
        waveform_int16 = np.int16(waveform / np.max(np.abs(waveform)) * 32767)
        sa.WaveObject(waveform_int16, 1, 2, sample_rate).save(filepath)
    else:
        return waveform, sample_rate

def sonification_dataframe(df, pitch_col, duration_col, volume_col, sample_rate=44100, filepath=None):
    df, label_encoders = preprocess_dataframe(df)
    waveform, sr = map_features_to_audio(df, pitch_col, duration_col, volume_col, sample_rate)
    return save_or_return_audio(waveform, sr, filepath)

# Example usage:
df = pd.DataFrame({
    'pitch': [0.2, 0.4, 0.6, 0.8],
    'duration': [0.5, 0.5, 0.5, 0.5],
    'volume': [0.5, 0.7, 0.9, 1.0]
})
waveform, sr = sonification_dataframe(df, 'pitch', 'duration', 'volume')

# To play the audio
if waveform is not None and len(waveform) > 0:
    play_obj = sa.play_buffer(np.int16(waveform / np.max(np.abs(waveform)) * 32767), 1, 2, sr)
    play_obj.wait_done()

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

sonification-0.0.9.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

sonification-0.0.9-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file sonification-0.0.9.tar.gz.

File metadata

  • Download URL: sonification-0.0.9.tar.gz
  • Upload date:
  • Size: 11.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.13

File hashes

Hashes for sonification-0.0.9.tar.gz
Algorithm Hash digest
SHA256 f289ec7a3818e3f0ff1f0b82baaf5e9c73b5d9dc13b525660deeab2e97d9bcf8
MD5 de449a405b717ba887c1356f2d6374c1
BLAKE2b-256 cddd383a6294fbc1631c101cb426008fe210fbfdb2c5e6dd3fd3cb0093816838

See more details on using hashes here.

File details

Details for the file sonification-0.0.9-py3-none-any.whl.

File metadata

  • Download URL: sonification-0.0.9-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.10.13

File hashes

Hashes for sonification-0.0.9-py3-none-any.whl
Algorithm Hash digest
SHA256 e06844d5fecdf9bbd6fa452892b79dc5ae55d5345d3e350b316e6048b5f946dd
MD5 986dcb3cc361969c9a739be760e969dd
BLAKE2b-256 d37708a7cb836bc781c00b19ca9edb53a9e7d916c0c170aac8204409eaa2a7f1

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page