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