Well, I solved it exactly as you said:
def to_linear16(<<>>) do
<<>>
end
# use littel-float-size here, as it seems our floats are littel endian
def to_linear16(<<v::little-float-size(32), r::binary>>) do
Logger.debug("#{inspect(v)}")
f =
if v < 0 do
<<trunc(v * 0x8000)::size(16)>>
else
<<trunc(v * 0x7FFF)::size(16)>>
end
f <> to_linear16(r)
end
I am still not sure, if this is an efficient way, but it works.
I might switch to the membrance framework, as it seems to have functionality like this build in.


















