Daniel@0: /* Part of DML (Digital Music Laboratory) Daniel@0: Copyright 2014-2015 Samer Abdallah, University of London Daniel@0: Daniel@0: This program is free software; you can redistribute it and/or Daniel@0: modify it under the terms of the GNU General Public License Daniel@0: as published by the Free Software Foundation; either version 2 Daniel@0: of the License, or (at your option) any later version. Daniel@0: Daniel@0: This program is distributed in the hope that it will be useful, Daniel@0: but WITHOUT ANY WARRANTY; without even the implied warranty of Daniel@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Daniel@0: GNU General Public License for more details. Daniel@0: Daniel@0: You should have received a copy of the GNU General Public Daniel@0: License along with this library; if not, write to the Free Software Daniel@0: Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Daniel@0: */ Daniel@0: Daniel@0: :- module(dsp, Daniel@0: [ spectrogram/2 Daniel@0: , spectrogram/3 Daniel@0: , spectrum/2 Daniel@0: , sum/2 Daniel@0: ]). Daniel@0: Daniel@0: :- use_module(library(semweb/rdf_db)). Daniel@0: :- use_module(library(sandbox)). Daniel@0: :- use_module(library(rdfutils)). Daniel@0: :- use_module(library(memo)). Daniel@0: :- use_module(library(mlserver)). Daniel@0: Daniel@0: :- set_prolog_flag(double_quotes,string). Daniel@0: Daniel@0: :- setting(specgram_dynamic_range,number,90,"Dynamic range in dB for spectrograms"). Daniel@0: Daniel@0: spectrogram(URI,X) :- Daniel@0: rdf_text(URI,beets:path,P), Daniel@0: X===specgrm( monofile(P), hanning(2048),512). Daniel@0: Daniel@0: :- volatile_memo spectrum(+atom,-ground). Daniel@0: spectrum(URI,X) :- Daniel@0: spectrogram(URI,Y), Daniel@0: X1===sum(Y,2), Daniel@0: persist_item(X1,X). Daniel@0: Daniel@0: spectrogram(URI,Offset,Length) :- Daniel@0: setting(specgram_dynamic_range,DBs), Daniel@0: ( cp_audio:audio_file(URI,P,Fmt), Daniel@0: ( Fmt=just(aac) Daniel@0: -> MSignal=sndfile(q(P),q(enc),q(aac)) Daniel@0: ; MSignal=sndfile(q(P)) Daniel@0: ) Daniel@0: ; cp_audio:audio_link(URI,P,just(mp3)), Daniel@0: MSignal=mp3file(q(P)) Daniel@0: ), !, Daniel@0: ?? (specgrm( taket(Length,dropt(Offset,mixdown(MSignal))), Daniel@0: hanning(2048),512,"range",DBs,"offset",Offset); Daniel@0: ylim([0,15])). Daniel@0: Daniel@0: sum(Items,Sum) :- Daniel@0: once(member(X,Items)), Daniel@0: D===numdims(X)+1, Daniel@0: Sum===sum(cellcat(D,cell(Items)),D). Daniel@0: Daniel@0: sandbox:safe_primitive(dsp:spectrogram(_,_,_)).