#!/usr/bin/env python3 """Gera o efeito de explosao do ReTux (CC0, feito por nos, so aritmetica inteira: mesmos bytes em qualquer maquina). python3 -I explosion.py O explosion.wav do repositorio nao tem autor nem licenca registrados no data/LICENSES (e nao e o do SuperTux de hoje), entao o build o troca por este: ruido (xorshift32) com ataque rapido e queda exponencial, em duas camadas (um estalo agudo e um estrondo grave, filtrado por um polo so), 1,7 s, mono, 44,1 kHz, 16 bits, como o original. """ import sys import wave RATE = 44100 N = 76755 def main(out): state = 2463534242 low = 0 low2 = 0 env_crack = 1 << 16 env_boom = 0 samples = bytearray() for i in range(N): state ^= (state << 13) & 0xFFFFFFFF state ^= state >> 17 state ^= (state << 5) & 0xFFFFFFFF noise = (state & 0xFFFF) - 32768 # -32768..32767 # estrondo grave: dois filtros de um polo em cascata, ataque de 15 ms e queda lenta low += (noise - low) >> 5 low2 += (low - low2) >> 4 attack = min(i * 65536 // 660, 65536) env_boom = attack * (65536 - (i * 65536 // N)) >> 16 env_boom = env_boom * env_boom >> 16 boom = (low2 * env_boom >> 16) * 3 # estalo agudo e curto env_crack = env_crack * 64700 >> 16 crack = (noise * env_crack >> 16) // 2 v = (boom + crack) // 2 * 15 // 4 v = max(-32768, min(32767, v)) samples += v.to_bytes(2, "little", signed=True) with wave.open(out, "wb") as w: w.setnchannels(1) w.setsampwidth(2) w.setframerate(RATE) w.writeframes(bytes(samples)) main(sys.argv[1])