|
- // tonalisa - software to look at overtone-structures
- // Copyright (C) 2016 Dominik Schmidt-Philipp
- //
- // This program is free software: you can redistribute it and/or modify
- // it under the terms of the GNU General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU General Public License for more details.
- //
- // You should have received a copy of the GNU General Public License
- // along with this program. If not, see <http://www.gnu.org/licenses/>.
- //
- import QtQuick 2.0
-
- Item {
- id:root
- width:512; height:300
-
- property string file: activeAudioFile.path
- property real sampleRate: activeAudioFile.sampleRate
- property int fftSize: activeAudioFile.npts
- property var fftData: activeAudioFile.spectrum
- property var grid: [[100,300,500,1000,2000,5000,10000]]
- property var pixelData: []
- property real leftHz: 0
- property real rightHz: 10000
-
- property real max:0
- property real min:0
-
- function binToHertz(bin) {
- return bin * sampleRate / fftSize
- }
- function hertzToBin(hertz) {
- return Math.floor(hertz * fftSize / sampleRate)
- }
- function binToX(bin) {
- return width * (binToHertz(bin)-leftHz)/(rightHz-leftHz)
- }
- onFftDataChanged: {
- display.requestPaint()
- }
- onLeftHzChanged: {
- display.requestPaint()
- }
- onRightHzChanged: {
- display.requestPaint()
- }
- Canvas {
- id: display
- anchors.fill: parent
- function scale(val){
- return -Math.log(val/sampleRate) * 8
- }
- onPaint: {
- var ctx = getContext("2d")
-
- ctx.fillStyle = Qt.rgba(255,255,255,1);
- ctx.fillRect(0,0,width,height);
-
- ctx.beginPath()
- var i = hertzToBin(leftHz)
- ctx.moveTo(binToX(i),scale(fftData[i]))
-
- while ( i<hertzToBin( rightHz )) {
- i++
-
- ctx.lineTo(binToX(i),scale(fftData[i]))
- }
- ctx.strokeStyle = "#000000";
- ctx.stroke()
- }
- MouseArea {
- anchors.fill: parent
- onPressed: {
- fftvalue.text = "val= " + fftData[mouse.x];
- }
- }
- }
- }
|