1*a77ebd86Schristos#!/usr/bin/env bash 2*a77ebd86Schristos 3*a77ebd86Schristos## bash script to generate file magic support for flac. 4*a77ebd86Schristos## https://github.com/file/file/blob/master/magic/Magdir/audio 5*a77ebd86Schristos## below "#some common sample rates" (line 471), ie: 6*a77ebd86Schristos## >>17 belong&0xfffff0 0x2ee000 \b, 192 kHz 7*a77ebd86Schristos 8*a77ebd86SchristosLANG=C 9*a77ebd86Schristos 10*a77ebd86Schristostarget=magic/Magdir/audio 11*a77ebd86Schristos 12*a77ebd86Schristos## construct static list of sample rates based on standard crystal 13*a77ebd86Schristos## oscillator frequencies. 14*a77ebd86Schristos## 16.384 MHz Unknown audio application 15*a77ebd86Schristos## (16384 kHz = 32 kHz * 512 = 32 * 2^9) 16*a77ebd86Schristos## 22.5792 MHz Redbook/CD 17*a77ebd86Schristos## (22579.2 kHz = 44.1kHz * 512 = 44.1 * 2^9) 18*a77ebd86Schristos## also used: 11.2896, 16.9344, 33.8688 and 45.1584 19*a77ebd86Schristos## 24.576 MHz DAT/Video 20*a77ebd86Schristos## (24576 kHz = 48 kHz * 512 = 48 * 2^9) 21*a77ebd86Schristos## also used: 49.1520 22*a77ebd86Schristos 23*a77ebd86Schristos## 33.8688 > 16.9344 24*a77ebd86Schristos## 36.864 > 18.432000 25*a77ebd86Schristosdeclare -a a_ground_fs=(16384000 22579200 24576000) 26*a77ebd86Schristos 27*a77ebd86Schristos## multiply ground clock frequencies by 1953 to get usable base 28*a77ebd86Schristos## frequencies, for instance: 29*a77ebd86Schristos## DAT/video: 24.576 MHz * 1000000 / 512 = 48000Hz 30*a77ebd86Schristos## Redbook/CD: 22.5792 MHz * 1000000 / 512 = 44100Hz 31*a77ebd86Schristos## use base rates for calculating derived rates 32*a77ebd86Schristosdeclare -a samplerates 33*a77ebd86Schristos## min divider: fs/n 34*a77ebd86Schristosdef_fs_n=512 35*a77ebd86Schristosmin_fs_n=4 36*a77ebd86Schristos## start at base_fs/(def_fs*min_fs) 37*a77ebd86Schristos## add each derived sample rate to the array 38*a77ebd86Schristosfor base_fs in "${a_ground_fs[@]}"; do 39*a77ebd86Schristos min_fs=$( echo "${base_fs} / ( ${def_fs_n} * ${min_fs_n} )" | bc) 40*a77ebd86Schristos ## max multiplier: fs*n*min_fs 41*a77ebd86Schristos max_fs_n=$(( 8 * min_fs_n )) 42*a77ebd86Schristos n=${max_fs_n} 43*a77ebd86Schristos while [[ ${n} -ge 1 ]]; do 44*a77ebd86Schristos sample_rate=$(( min_fs * n )) 45*a77ebd86Schristos samplerates+=(${sample_rate}) 46*a77ebd86Schristos n=$(( n / 2 )) 47*a77ebd86Schristos done 48*a77ebd86Schristosdone 49*a77ebd86Schristos 50*a77ebd86Schristosdeclare -a stripped_rates 51*a77ebd86Schristosdeclare -a lines 52*a77ebd86Schristosfor samplerate in "${samplerates[@]}"; do 53*a77ebd86Schristos ## use bc with sed to convert and format Hz to kHz 54*a77ebd86Schristos stripped_rate="$(LANG=C bc <<< "scale=5; ${samplerate} / 1000" | \ 55*a77ebd86Schristos sed 's#[0\.]*$##g')" 56*a77ebd86Schristos ## only add uniq sample rates (should be necessary 57*a77ebd86Schristos if [[ ! "${stripped_rates[@]}" =~ ${stripped_rate} ]]; then 58*a77ebd86Schristos printf -v line ">>17\tbelong&%#-15x\t%#08x\t%s, %s kHz\n" \ 59*a77ebd86Schristos "16777200" \ 60*a77ebd86Schristos "$(( samplerate * 16 ))" \ 61*a77ebd86Schristos "\b" \ 62*a77ebd86Schristos "${stripped_rate}" 63*a77ebd86Schristos stripped_rates+=("${stripped_rate}") 64*a77ebd86Schristos lines+=("${line}") 65*a77ebd86Schristos fi 66*a77ebd86Schristos 67*a77ebd86Schristosdone 68*a77ebd86Schristosprintf "## start cutting >>> \n" 69*a77ebd86Schristos## print out the formatted lines 70*a77ebd86Schristosprintf "%s" "${lines[@]}" | sort -k5 -n 71*a77ebd86Schristosprintf "## <<< stop cutting\n" 72