open Soundml
let () =
let input_path = "input.wav" in
let output_path = "output.ogg" in
try
let audio_track =
Io.read ~res_typ:Io.SOXR_HQ ~sample_rate:22050 ~mono:true Bigarray.Float32
input_path
in
let reversed_audio = Audio.reverse audio_track in
let data, sr = (Audio.data reversed_audio, Audio.sr reversed_audio) in
try
match Aformat.create ~subtype:Aformat.VORBIS Aformat.OGG with
| Ok fmt ->
Io.write ~format:fmt output_path data sr
| Error msg ->
Printf.eprintf "Warn: OGG Vorbis init: %s. Using inferred.\n" msg ;
Io.write output_path data sr ;
Printf.printf "Wrote '%s' (inferred format).\n" output_path
with
| (Io.Invalid_format _ | Io.Internal_error _) as e ->
Printf.eprintf "Write Error ('%s'): %s\n" output_path
(Printexc.to_string e)
| ex ->
Printf.eprintf "Unexpected Write Error ('%s'): %s\n" output_path
(Printexc.to_string ex)
with
| Io.File_not_found msg ->
Printf.eprintf "Read Error: Input '%s' not found: %s.\n" input_path msg
| Io.Invalid_format msg ->
Printf.eprintf "Read Error: Invalid input: %s\n" msg
| Io.Resampling_error msg ->
Printf.eprintf "Read Error: Resampling: %s\n" msg
| Io.Internal_error msg ->
Printf.eprintf "Read Error: Internal SoundML: %s\n" msg
| ex ->
Printf.eprintf "Unexpected Read Error: %s\n" (Printexc.to_string ex)
open Soundml
let create_sine_wave sr duration freq amplitude =
let samples = int_of_float (sr *. duration) in
let data = Audio.G.create Bigarray.Float32 [|samples|] 0. in
for i = 0 to samples - 1 do
let time = float_of_int i /. sr in
Audio.G.set data [|i|] (amplitude *. sin (2. *. Float.pi *. freq *. time))
done ;
data
let stft =
let sample_rate = 44100.0 in
let duration = 1.0 in
let frequency = 440.0 in
let amplitude = 0.5 in
let audio_signal =
create_sine_wave sample_rate duration frequency amplitude
in
let win_length = 2048 in
let window = `Hanning in
let config = Transform.Config.{default with window; win_length} in
Transform.stft ~config Types.B32 audio_signal
open Soundml
open Soundml.Effects
let () =
let input_path = "input.wav" in
let output_path = "output_highpass.wav" in
let target_sample_rate = 44100 in
let cutoff_frequency = 300.0 in
let audio_track =
Io.read Bigarray.Float32 ~sample_rate:target_sample_rate input_path
in
let original_audio_data = Audio.data audio_track in
let actual_sample_rate = Audio.sr audio_track in
let highpass_filter =
Filter.IIR.HighPass.create
{cutoff= cutoff_frequency; sample_rate= actual_sample_rate}
in
let filtered_audio_data =
Filter.IIR.HighPass.process highpass_filter original_audio_data
in
Io.write output_path filtered_audio_data actual_sample_rate