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