La Transformée de Fourier et la Musique

Programme en C++ Qt6 basé directement sur la transformée de Fourier rapide. Retrouve les notes de musique (et leur code midi) à partir d'un fichier audio (fichier.wav)
Ce fichier source doit être stéréo échantillonné à 48kb/s, ce qui peut être facilement obtenu avec le soft avidemux (par exemple), éventuellement après extraction de la piste audio d'une vidéo .mp4.

1 Vue d'ensemble



Les notes obtenues peuvent être rejouées, les durées et le rythme sont pris en compte

2 Scan en cours (Transformée de fourier d'un échantillon de signal)

3 Aperçu en vidéo


A voir directement sur Youtube en 1080p pour voir les détails !!!

4 Le code source 'MUSIQUE' en C++ Qt6: fichier mainwindow.cpp



CODE SOURCE en C++
  1. /* top
  2.   Calcul de la transformée de Fourier rapide d'un signal audio au format PCM enregistré dans un fichier .wav
  3.   Format WAVE, RIFF, fmt échantilloné à 48000Hz
  4.  
  5.   Format : Wave
  6.   File size : 2.39 MiB
  7.   Duration : 13 s 54 ms
  8.   Overall bit rate mode : Constant
  9.   Overall bit rate : 1 536 kb/s
  10.  
  11.   Audio
  12.   Format : PCM
  13.   Format settings : Little / Signed
  14.   Codec ID : 1
  15.   Duration : 13 s 54 ms
  16.   Bit rate mode : Constant
  17.   Bit rate : 1 536 kb/s
  18.   Channel(s) : 2 channels
  19.   Sampling rate : 48.0 kHz
  20.   Bit depth : 16 bits
  21.   Stream size : 2.39 MiB (100%)
  22.  
  23.   Programme écrit par Silicium628
  24.   ce logiciel est libre et open source
  25. */
  26. /*
  27. ***** RAPPEL**** (source: https://helpx.adobe.com/fr/audition/using/digitizing-audio.html) **
  28. Taux d’échantillonnage Niveau de qualité Plage de fréquences
  29.  
  30. 11,025 Hz Faible qualité radio AM (multimédia bas de gamme) 0- 5 512 Hz
  31. 22,050 Hz Comparable à la qualité radio FM (multimédia haut de gamme) 0-11 025 Hz
  32. 32 000 Hz Meilleur que la qualité radio FM (taux de diffusion standard) 0-16 000 Hz
  33. 44 100 Hz CD 0-22 050 Hz
  34. 48 000 Hz DVD standard 0-24 000 Hz
  35. 96 000 Hz DVD Blu-ray 0-48 000 Hz
  36. *********************************************************************************************/
  37. /*
  38. Le présent logiciel est paramétré pour traiter les fichiers audio ECHANTILLONES à 48000Hz (qualité DVD)
  39. (ET PAS 44.1 !!)
  40. Je le rendrai peut-être compatible avec les autres taux, mais pour l'instant il faut enregistrer
  41. au préalable l'audio à traiter avec un taux de 48kHz
  42. (par exemple avec Audacity, c'est facile).
  43. */
  44.  
  45.  
  46. #include "mainwindow.h"
  47. #include "ui_mainwindow.h"
  48.  
  49. #include "math.h"
  50. #include "complexe.cpp"
  51.  
  52. #include <QMessageBox>
  53. #include <QtWidgets/QInputDialog>
  54. #include <QFileDialog>
  55. #include <QFile>
  56. //#include <QImage>
  57.  
  58. #include <QtMultimedia/QMediaPlayer>
  59. #include <QAudioOutput>
  60.  
  61. #include <QMouseEvent>
  62. #include <QDate>
  63. #include <QDateTime>
  64. #include <QScrollBar>
  65. #include <QPixmap>
  66.  
  67.  
  68.  
  69. /* FFT_wav */
  70. //=============================================================================================
  71. // nouvelle numérotation par (date de compilation + 1 lettre si plusieurs compils le même jour)
  72. // toute version antérieure à la plus récente doit être jetée dans la poubelle jaune.
  73. QString version = "2025-09-11 b";
  74. //=============================================================================================
  75.  
  76. int write_mode =0;
  77.  
  78. QString couleur_ecran = "#141414";
  79. QString couleur_ligne = "#878787";
  80. QString couleur_trace1 = "#0EA004";
  81. QString couleur_trace2 = "#00FFFF";
  82. QString couleur_curseur = "#FFFF00";
  83. QString couleur_texte = "#FFFF00"; // JAUNE
  84. QString couleur_encadrement = "#FF0000"; // ROUGE
  85.  
  86. QPen pen_ligne(QColor(couleur_ligne), 1, Qt::SolidLine);
  87. QPen pen_trace1(QColor(couleur_trace1), 1, Qt::SolidLine);
  88. QPen pen_trace2(QColor(couleur_trace2), 1, Qt::SolidLine);
  89. QPen pen_curseur(QColor(couleur_curseur), 1, Qt::SolidLine);
  90. QPen pen_reticule(QColor(couleur_ligne), 1, Qt::SolidLine);
  91. QPen pen_encadrement(QColor(couleur_encadrement), 1, Qt::SolidLine);
  92.  
  93. char temp_entete[100]; // signal entete lu dans le fichier .wav
  94. char temp_data[2000000]; // signal audio lu dans le fichier .wav (max 2MB)
  95. int pas_echantillonage = 24;
  96.  
  97. const int _nb_ech = 2048;
  98.  
  99. Complexe ech[_nb_ech]; // nb_ech echantillons
  100. Complexe tab_X[_nb_ech]; // nb_ech valeurs traitées
  101. Complexe tab_W[_nb_ech];
  102. bool tableau_w_plein = false;
  103.  
  104. uint8_t table_FREQ_midi[2000][1]; // [t][num_raie]
  105. double table_integration_amplitudes[84];// [code midi]
  106.  
  107. uint32_t table_histogramme_durees[35]; // [valeur_duree] = nb d'occurences
  108. const uint16_t _Hmax =42;
  109. uint16_t table_histogramme_midi[_Hmax]; // [num_midi] = nb d'occurences
  110. uint16_t table_histogramme_degre[12]; //[n°degre = 1..12] = nb d'occurences
  111.  
  112. double facteur_compression=1.0;
  113.  
  114. uint nb_etapes=10; // 10
  115. uint nb_ech = pow (2, nb_etapes); // nombre d'échantillons = 2 puissance(nb_etapes) ->2^10 = 1024
  116.  
  117. double table_modules_FFT[_nb_ech /2]; // = 2^10
  118.  
  119. double x_clic_ecran, y_clic_ecran;
  120. double x_clic_GRV4, y_clic_GRV4; // relatif à graphicsView4
  121.  
  122. double x0_boite, x1_boite, y0_boite, y1_boite;
  123.  
  124. int type_accords=0; // 1=MAJ; 2=min; 3=7e dom
  125.  
  126. int nb_tics;
  127. int nb_tics2=0;
  128. int delta_barre=0;
  129. int num_barre_en_cours=0; // permet de tracer l'avancement de l'exécution des notes du morceau
  130. int num_barre_saisie=0; // pour le composeur manuel
  131. long T_i=0; // variable GLOBALE
  132. int n_player=1;
  133. double seuil;
  134. double gain =1.0;
  135. int num_note_depart;
  136. int num_note_cliquee=0;
  137. int num_note_jouee=0;
  138. int num_ligne_en_cours=0; // lignes du tableWidget_3
  139. int n_midi_jouee;
  140. int ligne_TW3;
  141. int nb_acc=0;
  142. int num_note_max=0;
  143. double memo_scroll_x=0;
  144. QDateTime temps_0; // départ du jeu des notes
  145. bool hamming = true;
  146. bool bourrage_de_zeros = true;
  147.  
  148. // type de mesure noté Ta/Tb (4/4, 3/2 ...)
  149. int8_t Ta = 4;
  150. int8_t Tb = 4;
  151.  
  152. int n_barre_copie;
  153.  
  154.  
  155.  
  156. //QList<int> index_midi; // position x des notes midi sur le graphe FFT (à partir de midi=40)
  157. //QList<QString> liste_couleurs;
  158. QList<ENR_FFT> liste_ENR_FFT; // liste de "notes" détectées (maximums de FFT)
  159. QList<NOTE> liste_NOTES;
  160. //QList<QString> noms_notes;
  161.  
  162. QList<QString> gamme_chromatique_d;
  163. QList<QString> gamme_chromatique_b;
  164. QList<QString> gamme_chromatique_GB;
  165.  
  166. QList<QString> types_note;
  167. QList<QString> types_silence;
  168.  
  169.  
  170. QFile file_wav; // fichier à analyser
  171. QFile file_dat; // datas du TAB_FRQ
  172.  
  173. QDir currentDir;
  174. QString base_Dir;
  175. QString default_Dir = "/home/";
  176. QString string_currentDir = default_Dir; // à priori; sera mis à jour lors de la lecture du fichier 'params.ini'
  177. QString string_currentFile;
  178. QString nom_fichier_in="";
  179.  
  180. QDataStream binStream1;
  181.  
  182. double duree_totale; // calculée dans la fonction 'decode_entete'
  183. double data_size; // calculée dans la fonction 'decode_entete'
  184.  
  185. bool wav_ok = false;
  186. //bool dossier_de_travail_ok = false;
  187. bool data_nts_ok = false;
  188. bool rapide = false;
  189. bool etendre = true;
  190. bool mode_composition = false;
  191.  
  192. //bool visu_T = true;
  193. //bool visu_notesM = false;
  194. //bool visu_M; // echelle temporelle sous forme de mesures (temps forts, temps faibles)
  195. //bool visu_T; // echelle temporelle simple en 1/40s
  196.  
  197. char mode = 'T'; // T ou M
  198.  
  199. bool visu_freq = true;
  200. bool visu_ech_tps;
  201. //bool mode_select = false;
  202.  
  203. bool visu_duree_notes = true;
  204. int duree_int = 4;
  205. bool visu_notes = true;
  206. bool visu_notes_auto = true;
  207. bool lecture_en_cours = false;
  208.  
  209. uint32_t offset_t;
  210. uint32_t x_ligne_FFT =0;
  211. double zoom_x =1.0;
  212.  
  213.  
  214. QString repertoire_images= "./images/";
  215. int case_min=0;
  216. int case_max=20;
  217. uint16_t largeur_image = 1216; // image du manche de la guitare
  218. uint16_t hauteur_image = 180;
  219. QList<uint16_t> positionsX;
  220. bool notes_pleines = true; // concerne le graphique : ellipse pleine ou bien juste un cercle
  221. bool notes_silencieuses; // pour représenter les positions d'accords, sans les jouer
  222. bool mode_depot_note=false; // pour écrire la valeur midi d'une note dans TW3 suite à clic de droite le manche
  223. //bool data_ok = false;
  224. bool dossier_de_travail_ok = false;
  225. int memo_corde_i;
  226. int memo_case_i;
  227.  
  228. int corde_jouee;
  229. int case_jouee;
  230.  
  231. int Tp1;
  232. int temps1;
  233. int nb_notes_jouees=0;
  234. int nb_notes_jouees_max;
  235. int lecture_pause=1; // fonction du bouton lecture / pause
  236.  
  237. QStringList liste_str_in;
  238. QStringList liste_accords;
  239.  
  240. int nb_lignes;
  241. int L_save_min=0;
  242. int L_save_max=0;
  243.  
  244. int mesure_a_encadrer=0;
  245. int memo_mesure_a_encadrer=0;
  246. int num_colonne_a_encadrer=0;
  247. int nb_colonnes_a_encadrer=1;
  248. int zoom=1;
  249.  
  250. QList<QString> liste_couleurs;
  251. QImage image1(1900, 1000, QImage::Format_RGB888);
  252. QPainter painter1(&image1);
  253.  
  254.  
  255.  
  256. MW::MW(QWidget *parent) :
  257. QMainWindow(parent)
  258. {
  259. setupUi(this);
  260. setWindowTitle("MUSIQUE - version " + version);
  261.  
  262. //this->setGeometry(0,0, 1900, 1000);
  263. setWindowState(Qt::WindowMaximized);
  264. Boite_Onglets_Global->setGeometry(0,0, 1920, 1280);
  265. Boite_Onglets_Global->setCurrentIndex(0);
  266.  
  267. // ============================== ONGLET 0 (le plus à gauche) ============================================
  268.  
  269. // SCENE 1 - celle du haut ('Transformée de Fourier' ET 'partie échantillonée du signal')
  270. scene1 = new QGraphicsScene(this);
  271. scene1->setBackgroundBrush(QColor(couleur_ecran));
  272. graphicsView1->setScene(scene1);
  273. graphicsView1->setGeometry(0, 0, 1900, 655); //( 0, 0, 1900, 700)
  274. graphicsView1->verticalScrollBar()->setValue(0);
  275.  
  276. calque_notes = new QGraphicsItemGroup();
  277. scene1->addItem(calque_notes);
  278. calque_reticule1 = new QGraphicsItemGroup();
  279. scene1->addItem(calque_reticule1);
  280. afficher_titre_calque("Transformée de Fourier", 0, 0, calque_reticule1);
  281.  
  282. calque_trace_signal1 = new QGraphicsItemGroup();
  283. scene1->addItem(calque_trace_signal1);
  284.  
  285. calque_trace_FFT = new QGraphicsItemGroup();
  286. scene1->addItem(calque_trace_FFT);
  287.  
  288. calque_curseur = new QGraphicsItemGroup();
  289. scene1->addItem(calque_curseur);
  290.  
  291. calque_lignes_F_zero = new QGraphicsItemGroup();
  292. scene1->addItem(calque_lignes_F_zero);
  293.  
  294. //-----------------------------------------------------
  295. // SCENE 2 - celle du bas ('Fichier Audio .wav')
  296.  
  297. scene2 = new QGraphicsScene(this);
  298. QBrush QB1("#222222");
  299. scene2->setBackgroundBrush(QB1); // couleur_ecran
  300.  
  301. graphicsView2->setScene(scene2);
  302. graphicsView2->setGeometry(0, 660, 1900, 200); // (0, 660, 1900, 200)
  303.  
  304. calque_trace_signal2 = new QGraphicsItemGroup();
  305. scene2->addItem(calque_trace_signal2);
  306.  
  307.  
  308. calque_reticule2 = new QGraphicsItemGroup();
  309. scene2->addItem(calque_reticule2);
  310. afficher_titre_calque("Fichier Audio .wav", 0, -80, calque_reticule2);
  311.  
  312. calque_encadrement1 = new QGraphicsItemGroup();
  313. scene2->addItem(calque_encadrement1);
  314.  
  315. calque_encadrement2 = new QGraphicsItemGroup();
  316. scene2->addItem(calque_encadrement2);
  317.  
  318. // =============== ONGLET 1 (le deuxième onglet, la numérotation débute à 0)- NOTES ===================================
  319.  
  320. // SCENE 3 - LISTE verticale NOTES
  321. //scene3 = new QGraphicsScene(this);
  322. // scene3->setBackgroundBrush(QColor(couleur_ecran));
  323. // graphicsView3->setScene(scene3);
  324.  
  325. //-----------------------------------------------------
  326. // SCENE 4 (grilles T et/ou M) (T comme temporelle, M comme mesures)
  327.  
  328. scene4 = new QGraphicsScene(this);
  329. scene4->setBackgroundBrush(QColor(couleur_ecran));
  330. GV_grillesTM->setScene(scene4);
  331.  
  332.  
  333. calque_grille_M = new QGraphicsItemGroup();
  334. scene4->addItem(calque_grille_M);
  335.  
  336. calque_grille_T = new QGraphicsItemGroup();
  337. scene4->addItem(calque_grille_T);
  338.  
  339. calque_noms_notes = new QGraphicsItemGroup();
  340. scene4->addItem(calque_noms_notes);
  341.  
  342. calque_TAB_FRQ = new QGraphicsItemGroup();
  343. scene4->addItem(calque_TAB_FRQ);
  344. afficher_titre_calque("Table Fréquences & notes", 200, 0, calque_TAB_FRQ);
  345.  
  346. calque_notes_manuelles = new QGraphicsItemGroup();
  347. scene4->addItem(calque_notes_manuelles);
  348.  
  349. calque_notes_auto = new QGraphicsItemGroup();
  350. scene4->addItem(calque_notes_auto);
  351.  
  352. calque_notes_jouee = new QGraphicsItemGroup();
  353. scene4->addItem(calque_notes_jouee);
  354.  
  355. calque_echelle_temporelle_T = new QGraphicsItemGroup();
  356. scene4->addItem(calque_echelle_temporelle_T);
  357.  
  358. calque_echelle_temporelle_M = new QGraphicsItemGroup();
  359. scene4->addItem(calque_echelle_temporelle_M);
  360.  
  361. calque_surbrillance= new QGraphicsItemGroup();
  362. scene4->addItem(calque_surbrillance);
  363.  
  364. calque_rect_select= new QGraphicsItemGroup();
  365. scene4->addItem(calque_rect_select);
  366.  
  367. //-----------------------------------------------------
  368. // SCENE 5 - Histogramme
  369.  
  370. scene5 = new QGraphicsScene(this);
  371. scene5->setBackgroundBrush(QColor(couleur_ecran));
  372. graphicsView5->setScene(scene5);
  373. calque_histogramme = new QGraphicsItemGroup();
  374. scene5->addItem(calque_histogramme);
  375.  
  376. // ============================== ONGLET 2 - INSTRUMENTS ===============================================
  377. // SCENE MANCHE (manche de la guitare)
  378. scene_manche = new QGraphicsScene(this);
  379. GRW_manche->setScene(scene_manche);
  380. GRW_manche->setGeometry(10, 100, largeur_image+20, hauteur_image+5);
  381.  
  382. Frame_wWidget1 = new QFrame();
  383.  
  384. charger_image_manche();
  385.  
  386. calque_notes_manche = new QGraphicsItemGroup();
  387. scene_manche->addItem(calque_notes_manche);
  388.  
  389. calque_encadrement3 = new QGraphicsItemGroup();
  390. scene_manche->addItem(calque_encadrement3);
  391.  
  392. case_min = 0;
  393. case_max = 20;
  394.  
  395. // ============================== ONGLET 3 - image FFT ===================================================
  396. label_image_FFT->setGeometry(0, 0, 1900, 1000);
  397. label_64->setGeometry(1200, 0, 600, 20);
  398. image1.fill("#081111");
  399.  
  400. //=========================================================================================================
  401.  
  402. Timer1 = new QTimer(this);
  403. connect(Timer1, SIGNAL(timeout()), this, SLOT(Tic1()));
  404.  
  405. Timer2 = new QTimer(this);
  406. connect(Timer2, SIGNAL(timeout()), this, SLOT(Tic2()));
  407.  
  408. Timer3 = new QTimer(this);
  409. connect(Timer3, SIGNAL(timeout()), this, SLOT(Tic3()));
  410.  
  411. connect(TW_3->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(TW_3_scroll(int)));
  412.  
  413.  
  414. //noms_notes<<"La"<<"Si"<<"Do"<<"Ré"<<"Mi" <<"Fa"<<"Sol"<<"--"<<"--"; // <- A B C D E F G
  415. gamme_chromatique_d<<"Do"<<"Do#"<<"Ré"<<"Ré#"<<"Mi"<<"Fa"<<"Fa#"<<"Sol"<<"Sol#"<<"La"<<"La#"<<"Si";
  416. gamme_chromatique_b<<"Do"<<"Do#"<<"Ré"<<"Mib"<<"Mi"<<"Fa"<<"Fa#"<<"Sol"<<"Sol#"<<"La"<<"Sib"<<"Si";
  417.  
  418. //la gamme GB commence en principe par la lettre A (=La) mais pour simplifier ce programme
  419. //on la fait partir de C (=Do) comme la gamme FR...
  420. gamme_chromatique_GB<<"C"<<"C#"<<"D"<<"Eb"<<"E"<<"F"<<"F#"<<"G"<<"G#"<<"A"<<"A#"<<"B";
  421.  
  422. types_note <<"ronde"<<"blanche"<<"noire"<<"croche"<<"double croche"<<"triple croche"<<""<<"";
  423. types_silence << "pause" << "demi-pause" << "soupir" << "demi-soupir" << "quart de soupir" << "";
  424.  
  425. // dans la liste suivante, la première couleur (#0)->"#EF2929" est le rouge pour la note DO
  426. liste_couleurs <<"#EF2929"<<"#FF5C00"<<"#FCAF3E"<<"#FFE300"<<"#BFFF00"<<"#07F64F"
  427. <<"#16D298"<<"#16D2C4"<<"#00AEFF"<<"#1667D2"<<"#7C00FF"<<"#FF67EF"<<"#EEEEEC"; //(la dernière = GRIS)
  428.  
  429. positionsX << 5 << 55 << 140 <<225 << 305 << 385 << 459 << 528 << 595 << 650 << 714 << 765
  430. << 820 << 864 << 910 << 960 << 1000 << 1035 << 1072 << 1111 << 1145;
  431. // 21 valeurs en comptant les cordes à vide
  432.  
  433. player1 = new QMediaPlayer;
  434. audioOutput1 = new QAudioOutput(this);
  435. player1->setAudioOutput(audioOutput1);
  436.  
  437. player2 = new QMediaPlayer;
  438. audioOutput2 = new QAudioOutput(this);
  439. player2->setAudioOutput(audioOutput2);
  440.  
  441. player3 = new QMediaPlayer;
  442. audioOutput3 = new QAudioOutput(this);
  443. player3->setAudioOutput(audioOutput3);
  444.  
  445. player4 = new QMediaPlayer;
  446. audioOutput4 = new QAudioOutput(this);
  447. player4->setAudioOutput(audioOutput4);
  448.  
  449. player5 = new QMediaPlayer;
  450. audioOutput5 = new QAudioOutput(this);
  451. player5->setAudioOutput(audioOutput5);
  452.  
  453. parametrages();
  454.  
  455. if(1)
  456. {
  457. //pour la phase de developpement
  458. afficher_titre_calque("Scene1", 100, 200, calque_trace_FFT);
  459. afficher_titre_calque("Scene2", 20, 20, calque_trace_signal2);
  460. //afficher_titre_calque("Scene3", 10, 10, calque_noms_notes);
  461. afficher_titre_calque("Scene4", 100, 100, calque_grille_T);
  462. afficher_titre_calque("Scene5", 20, 20, calque_histogramme);
  463. }
  464.  
  465. init_TW_3();
  466. on_Bt_AddLine_clicked();
  467.  
  468. }
  469.  
  470.  
  471. void MW::parametrages()
  472. {
  473. load_fichier_ini();
  474.  
  475. calcul_tableau_W();
  476. tracer_graduations_signal();
  477. tracer_graduations_FFT();
  478.  
  479. init_TW_1();
  480. init_TAB_FRQ();
  481. init_TAB_lst_notes();
  482. init_TW_type_M();
  483. init_Autres();
  484. init_onglet_instruments();
  485. init_TW_T();
  486. init_TW_doigts();
  487.  
  488. seuil = doubleSpinBox_seuil->value();
  489.  
  490. on_Bt_par_defaut_clicked();// valeurs FFT par défaut
  491.  
  492. write_mode=0;
  493. on_Bt_mode_R_clicked();
  494.  
  495. visu_notes_auto = false;
  496. on_Bt_toggle_visu_notes_auto_clicked();
  497.  
  498. visu_notes = false;
  499. on_Bt_toggle_visu_notes_clicked();
  500.  
  501. on_tableWidget_type_M_cellClicked(2, 0);
  502.  
  503. spinBox_zoom_2->setValue(2);
  504. // Bt_jouer_tout->setStyleSheet("background-color: rgb(200, 200, 200);");
  505.  
  506. progressBar_1->setValue(0);
  507.  
  508. effacer_calque(scene1,calque_lignes_F_zero );
  509. effacer_calque(scene1,calque_encadrement1 );
  510. effacer_calque(scene1,calque_trace_signal1 );
  511. effacer_calque(scene1,calque_trace_FFT );
  512. effacer_calque(scene1,calque_curseur );
  513.  
  514. effacer_calque(scene2,calque_encadrement2 );
  515. effacer_calque(scene2, calque_trace_signal2 );
  516.  
  517. effacer_calque(scene4,calque_TAB_FRQ );
  518. effacer_calque(scene4, calque_notes_manuelles );
  519. effacer_calque(scene4, calque_notes_auto );
  520. effacer_calque(scene4, calque_notes_jouee );
  521. effacer_calque(scene4, calque_echelle_temporelle_T);
  522.  
  523. for(int i=0; i<35; i++) { table_histogramme_durees[i]=0; }
  524. effacer_calque(scene5, calque_histogramme );
  525.  
  526. on_Bt_RAZ_clicked();
  527.  
  528. T_i=0; // T_i : variable GLOBALE
  529. doubleSpinBox_dxb->setValue(2.5);
  530.  
  531. mode='M';
  532. on_Bt_toggle_grille_T_clicked();
  533. mode_grille_T();
  534. spinBox_nb_barres->setValue(40);
  535. effacer_calque(scene4, calque_grille_T);
  536. tracer_grille_T();
  537. checkBox_scrolling->setChecked(true);
  538.  
  539. SBX_de->setValue(0); case_min = 0;
  540. SBX_a->setValue(20); case_max = 20;
  541.  
  542. }
  543.  
  544.  
  545.  
  546.  
  547. void MW::init_TAB_FRQ()
  548. {
  549. frame_notes->setGeometry(0,0,1920,720);
  550.  
  551. //graphicsView3->setGeometry(0, 30, 100, 730);
  552.  
  553. GV_grillesTM->setGeometry(0, 30, 2000, 730);
  554. GV_grillesTM->setEnabled(false); // empêche le recadrage auto par le contenu, mais disable le scroll manuel !
  555.  
  556. rectangle1 = new QGraphicsRectItem(0, 0, 2000, 670);
  557.  
  558. rectangle1->setPen(QColor(couleur_ligne));
  559. calque_TAB_FRQ->addToGroup(rectangle1);
  560. tracer_graduation_TAB_NOTES();
  561. tracer_grille_M();
  562. }
  563.  
  564.  
  565. void MW::init_TAB_lst_notes()
  566. {
  567. TW_lst_notes->setGeometry(1105, 30, 350, 201);
  568. QStringList liste_entetes1;
  569. liste_entetes1<<"num"<<"midi"<<"note"<<"n° barT"<< "n° barM)" << "-";
  570. TW_lst_notes->setColumnWidth(1, 40);
  571. TW_lst_notes->setColumnWidth(5, 50);
  572. TW_lst_notes->setHorizontalHeaderLabels (liste_entetes1);
  573. TW_lst_notes->setEditTriggers(QAbstractItemView::NoEditTriggers);
  574. }
  575.  
  576.  
  577.  
  578. void MW::init_TW_T() // TimeLine sur onglet 'INSTRUMENTS'
  579. {
  580. TW_TimeLine->setGeometry(10, 860, 1880, 135);
  581. TW_TimeLine->setColumnCount(300);
  582. label_timeline->setGeometry(10, 830, 100, 30);
  583.  
  584. TW_TimeLine->clear();
  585. for(int n=0; n< TW_TimeLine->columnCount(); n++)
  586. {
  587. complete_case(0, n, "-", "#000000", "#FFFFFF", false, TW_TimeLine);
  588. //complete_case(5, n, "-", "#000000", "#FFFFFF", tableWidget_T);
  589. }
  590. }
  591.  
  592.  
  593. void MW::init_TW_doigts()
  594. {
  595. TW_doigts->setGeometry(5, 20, 200, 200);
  596.  
  597. TW_doigts->clear();
  598. TW_doigts->setRowCount(5);
  599. TW_doigts->setColumnCount(3);
  600. QStringList liste_entetesH;
  601. liste_entetesH <<"corde"<<"case"<<"DOIGT";
  602. TW_doigts->setHorizontalHeaderLabels (liste_entetesH );
  603.  
  604. QStringList liste_entetesV;
  605. liste_entetesV <<"0"<<"1"<<"2"<<"3"<<"4";
  606. TW_doigts->setVerticalHeaderLabels(liste_entetesV );
  607.  
  608. for(int n=0; n<5; n++)
  609. {
  610. QTableWidgetItem *Item1 = new QTableWidgetItem();
  611. Item1->setIcon(QIcon("../images/02.png" ));
  612. TW_doigts->setItem(n, 2, Item1 );
  613. }
  614. TW_doigts->resizeColumnsToContents();
  615. TW_doigts->setColumnWidth(2, 20);
  616.  
  617. // pushButton_6->setGeometry(189, 0, 22, 21); // bouton aide position des doigts
  618.  
  619. Bt_copie_doigts_to_TW3->setGeometry(50, 147, 150, 26);
  620. Bt_RAZ_doigts->setGeometry(10, 147, 31, 26);
  621.  
  622.  
  623. int R, C;
  624. for (R=0; R<5; R++)
  625. {
  626. for (C=0; C<2; C++)
  627. {
  628. TW_doigts->setItem(R, C, new QTableWidgetItem ("-") );
  629. TW_doigts->item(R,C)->setTextAlignment(Qt::AlignCenter);
  630. }
  631. }
  632. }
  633.  
  634.  
  635.  
  636. void MW::init_Autres()
  637. {
  638. // frame_1->setGeometry(1250, 865, 410, 131);
  639. // frame_1->setVisible(true);
  640. frame_2->setGeometry(10, 865, 970, 75);
  641. frame_3->setGeometry(1000, 865, 665, 121);
  642. frame_5->setGeometry(0, 760, 1920, 260); // 0, 760, 1920, 260
  643. frame_6->setGeometry(10, 950, 901, 40);
  644.  
  645. graphicsView5->setGeometry(1460, 15, 440, 235); //225 histogrammes
  646. graphicsView5->setScene(scene5);
  647.  
  648. // voir le fichier de ressources
  649. // Le fichier image est incorporé sous forme de ressource, il sera compilé et fera partie du programme
  650. // l'image sera dispo quelle que soit l'emplacement de l'executable,
  651. // et en particulier si celui-ci est appellé via un lien.
  652. Bt_deplace_H->setIcon(QIcon(":/images/01.png" )); // Le fichier image est incorporé sous forme de ressource
  653. Bt_deplace_B->setIcon(QIcon(":/images/02.png" ));
  654. Bt_deplace_R->setIcon(QIcon(":/images/03.png" ));
  655. Bt_deplace_L->setIcon(QIcon(":/images/04.png" ));
  656.  
  657. Bt_plus->setIcon(QIcon(":/images/03.png" ));
  658. Bt_moins->setIcon(QIcon(":/images/04.png" ));
  659.  
  660. Bt_efface->setGeometry(915, 950, 60, 21);
  661. Bt_efface_2->setGeometry(1165, 0, 81, 26);
  662. Bt_9->setGeometry(1290, 10, 31, 20);
  663. Bt_open_DIR_2->setGeometry(912, 40, 70, 26);
  664. Bt_choix_current_dir_3->setGeometry(985, 40, 90, 26);
  665.  
  666. frame_8->setGeometry(1500, 740, 400, 30); // boutons "debut , < , > , fin"
  667. frame_9->setGeometry(1760, 850, 100, 70);
  668. frame_11->setGeometry(200, 152, 145, 21); // copie groupe de notes
  669.  
  670. Bt_save_notes->setGeometry(930, 5, 151, 31);
  671. Bt_RAZ_general->setGeometry(1700, 900, 150, 50);
  672. Bt_AddLine_2->setGeometry(1750, 780, 150, 60);
  673.  
  674. lineEdit_fichier_FREQ->setGeometry(1250, 0, 700, 22);
  675. progressBar_1->setGeometry(98, 4, 101, 18); //(1085, 3, 78, 18);
  676. lineEdit_fichier->setGeometry(380, 40, 530, 26);
  677. groupBox_2->setGeometry(380, 70, 350, 161);
  678. groupBox_3->setGeometry(750, 70, 351, 161);
  679.  
  680. Bt_dedoubleM->setGeometry(110, 5, 92, 26);
  681. // Bt_copie_depuis_TW3->setGeometry(200, 700, 200, 26);
  682. // Bt_copie_depuis_Instruments->setGeometry(200, 700, 251, 26);
  683.  
  684. // label_image1->setGeometry(1800, 780, 10, 10);
  685. frame_cle_de_sol->setGeometry(1700, 10, 200, 340); //1800, 805, 100, 170
  686. frame_cle_de_sol->setVisible(false);
  687. Bt_composition->setGeometry(1800, 10, 100, 30); // bouton 'Composition'
  688.  
  689. frame_composeur->setGeometry(1435, 80, 260, 181);
  690. frame_composeur->setVisible(false);
  691.  
  692. frame_params_3->setGeometry(1500, 800, 311, 131);
  693.  
  694. label_SEL_P_BOITE->setGeometry(120, 40, 260, 20);
  695. label_SEL_P_BOITE->setVisible(false);
  696.  
  697. GRBX_conf_accords->setGeometry(20, 470, 350, 181); // Configurateur d'Accords
  698. GRBX_pos_doigts->setGeometry(380, 470, 210, 180); // Position des doigts
  699. GRB_gestion_TW3->setGeometry(900, 490, 311, 351);
  700. GRBX_sigles->setGeometry(380, 660, 210, 121);
  701. GBX_general->setGeometry(160, 660, 210, 121);
  702.  
  703. LBL_corde->setGeometry(780, 465, 111, 25);
  704. LBL_case->setGeometry(780, 490, 111, 25);
  705.  
  706. create_100_lignes_V();
  707.  
  708. tracer_gradu_temporelle_signal_entree();
  709. tracer_graduations_signal();
  710.  
  711. label_MESSAGE->setVisible(false);
  712.  
  713. }
  714.  
  715.  
  716. void MW::init_TW_type_M()
  717. {
  718. frame_4->setGeometry(210, 5, 140, 90);
  719. frame_7->setGeometry(210, 100, 140, 50);
  720. frame_10->setGeometry(185, 100, 185, 50);
  721.  
  722. tableWidget_type_M->setGeometry(5, 20, 40, 62);
  723. lineEdit_10->setGeometry(55, 30, 51, 26);
  724. lineEdit_11->setGeometry(55, 60, 51, 26);
  725. label_8->setGeometry(2, 2, 111, 20);
  726. label_39->setGeometry(108, 63, 40, 20);
  727.  
  728. QStringList liste_labels; // pour mettre directement dans la 1ere colonne (et pas en entêtes)
  729. liste_labels << "2/4" << "3/4" << "4/4";
  730. for(int n=0; n<3; n++) { tableWidget_type_M->setItem(0, n, new QTableWidgetItem (liste_labels[n])); }
  731. }
  732.  
  733.  
  734. void MW::init_TW_1() // affi entete du fichier wav
  735. {
  736. TW_entete_wav->setGeometry(700, 200, 600, 300);
  737. Bt_close_entete->setGeometry(1280, 200, 20, 20);
  738. TW_entete_wav->setColumnCount(6);
  739. TW_entete_wav->setColumnWidth(4, 120);
  740. TW_entete_wav->setColumnWidth(5, 130);
  741.  
  742. TW_entete_wav->setVisible(false);
  743. Bt_close_entete->setVisible(false);
  744.  
  745. QStringList liste_entetes;
  746. liste_entetes <<"FileTypeBlocID"
  747. <<"FileSize"
  748. <<"FileFormatID"
  749. <<"FormatBlocID"
  750. <<"BlocSize"
  751. <<"AudioFormat"
  752. <<"NbrCanaux"
  753. <<"Frequence"
  754. <<"ECH (BytePerSec)"
  755. <<"BytePerBloc"
  756. <<"BitsPerSample"
  757. <<"DataBlocID"
  758. <<"DataSize"
  759. <<"durée calculée";
  760.  
  761. TW_entete_wav->setVerticalHeaderLabels(liste_entetes);
  762. }
  763.  
  764.  
  765. void MW::init_TW_3() // affi liste verticale sur ongler 'INSTRUMENTS'
  766. {
  767. label_TW3->setGeometry(1205, 10, 50, 18);
  768. TW_3->setGeometry(1250, 10, 640, 836); //(1250, 10, 640, 836) la valeur 836 est critique pour l'encadrement ok
  769. TW_3->clear();
  770. TW_3->setRowCount(0);
  771. TW_3->setColumnCount(14);
  772. QStringList liste_entetes;
  773. liste_entetes << "num" <<"note1"<<"note2"<<"note3"<<"note4"<<"Cmt"<<">"<<"dur"<<"M"<<"tps"<< "n°b"<<"ACC"<<"cases"<<"doigts";
  774. TW_3->setHorizontalHeaderLabels (liste_entetes );
  775. TW_3->resizeColumnsToContents();
  776. // for(int n=0; n<=1; n++)
  777. {
  778. // on_Bt_AddLine_clicked();
  779. }
  780. }
  781.  
  782.  
  783.  
  784. void MW::load_fichier_ini()
  785. {
  786. QString line;
  787. int p1, p2, p3;
  788.  
  789. dossier_de_travail_ok = false; // à priori
  790. QFile file1(QDir::currentPath() + "/" + "params_FFT.ini"); // dans le dossier de l'exécutable (= QDir::currentPath() )
  791. if (file1.open(QIODevice::ReadOnly | QIODevice::Text))
  792. {
  793. QTextStream in(&file1);
  794. in.reset();
  795. while ( !in.atEnd() )
  796. {
  797. line = in.readLine();
  798. if (line.at(0) !='#')
  799. {
  800. if ((p1 = line.indexOf("<currentDir>")) != -1)
  801. {
  802. p2 = line.indexOf('>',p1);
  803. p3 = line.indexOf("</",p2);
  804. QString s1 = line.mid(p2+1, p3-p2-1);
  805. string_currentDir = s1;
  806. dossier_de_travail_ok = true;
  807. }
  808.  
  809. if ((p1 = line.indexOf("<currentFile>")) != -1)
  810. {
  811. p2 = line.indexOf('>',p1);
  812. p3 = line.indexOf("</",p2);
  813. QString s1 = line.mid(p2+1, p3-p2-1);
  814. string_currentFile = s1;
  815. }
  816. }
  817. }
  818. file1.close();
  819. }
  820. else
  821. {
  822. QString s1 = "fichier .ini non trouvé, je le crée (dans le dossier de l'executable)";
  823. QMessageBox msgBox; msgBox.setText(s1); msgBox.exec();
  824. base_Dir=QDir::currentPath() + "/";
  825. save_fichier_ini();
  826. dossier_de_travail_ok = false;
  827. }
  828. lineEdit_current_dir->setText(string_currentDir); // sur l'onglet 'source wav'
  829. lineEdit_fichier->setText(string_currentDir); // sur l'onglet 'NOTES'
  830. lineEdit_current_dir_2->setText(string_currentDir); // sur l'onglet 'INSTRUMENTS'
  831. }
  832.  
  833.  
  834.  
  835. QString calcul_couleur(double x) // x = 0.0 à 1.0 ; return: rouge->jaune->vert
  836. {
  837. QString coul_str ="#000000";
  838. QString coul_R_str="#000000";
  839. QString coul_V_str="#000000";
  840. int R, V; // rouge, vert
  841.  
  842. V= x * 255;
  843. R= 300 - (1.2 * V);
  844.  
  845. double coxh;
  846. // la formule suivante met le jaune en valeur (avec un cosinus hyperbolique)
  847. coxh = 3.2 - 1.5 * cosh(2.6*x - 1.5); // merci kmplot (testez la courbe f(x) = 3.2 −1.5 * cosh(2.6x − 1.5) )
  848.  
  849. R *= coxh/1.2;
  850. V *= coxh/1.2;
  851.  
  852. coul_R_str.setNum(R, 16); coul_R_str = "0" + coul_R_str; coul_R_str = coul_R_str.right(2);
  853. coul_V_str.setNum(V, 16); coul_V_str = "0" + coul_V_str; coul_V_str = coul_V_str.right(2);
  854. coul_str = coul_R_str + coul_V_str;
  855. coul_str = "#" + coul_str + "00";
  856. return coul_str; // de la forme "#AABB00" (rouge & vert en exa, (bleu à zéro, à traiter))
  857. }
  858.  
  859.  
  860.  
  861. int MW::calcul_y_note(int midi) // en pixels sur la grille
  862. {
  863. int y =707 - ((midi-28) * 12); // voir 'tracer_graduation_TAB_NOTES()' pour l'espacement vertical
  864. return y;
  865. }
  866.  
  867.  
  868.  
  869. int MW::calcul_hauteur_note(int mid) //'hauteur' au sens musical, gamme chromatique de 0 à 11
  870. {
  871. int h1 = mid;
  872.  
  873. while(h1>=12) {h1-=12;}
  874. while(h1<0) {h1+=12;}
  875. if (h1==12) {h1=0;}
  876. if ((h1<0) || (h1>(liste_couleurs.length()-1))) {h1 = 0;}
  877.  
  878. return h1; // h1 = 0..11
  879. }
  880.  
  881.  
  882.  
  883. QString MW::nom_note(int mid)
  884. {
  885. QString s1;
  886.  
  887. int h1 = calcul_hauteur_note(mid);
  888. s1 = gamme_chromatique_b[h1];
  889. return s1;
  890. }
  891.  
  892.  
  893. QString MW::nom_note_GB(int mid)
  894. {
  895. QString s1;
  896.  
  897. int h1 = calcul_hauteur_note(mid);
  898. s1 = gamme_chromatique_GB[h1];
  899. return s1;
  900. }
  901.  
  902.  
  903. QString MW::nom_octave_GB(int mid)
  904. {
  905. QString octave;
  906. if((mid>=40)&&(mid < 48)) {octave = "2";}
  907. if((mid>=48)&&(mid < 60)) {octave = "3";}
  908. if((mid>=60)&&(mid < 72)) {octave = "4";}
  909. if((mid>=72)&&(mid < 90)) {octave = "5";}
  910. return octave;
  911. }
  912.  
  913.  
  914.  
  915. double freq_mid(int midi_i) // calcule la fréquence (en Hertz) d'une note à partir de son numéro midi
  916. {
  917. // https://fr.wikipedia.org/wiki/MIDI_Tuning_Standard
  918. double F, A;
  919. A=((double)midi_i-69.0)/12.0;
  920. F= 440 * powf(2,A);
  921. return F;
  922. }
  923.  
  924.  
  925. double calcul_id_midi(double freq_i) // complément de la fonction précédente ( double freq_mid(int midi_i) )
  926. {
  927. double id;
  928. id = 69.0 + 12.0 * log2(freq_i / 440.0);
  929. return id;
  930. }
  931.  
  932. /*
  933. int MW::calcul_num_midi(double x) // en fonction de la position horizontale dans le tableau d'affichage de la FFT
  934. {
  935. // on va détecter la note la plus proche de la position donnée
  936. // rappel : x=96 +(m-28) * 32 (voir la fonction : 'tracer_graduations_FFT()')
  937.  
  938.   double dx;
  939.   double xm;
  940.  
  941.   for (int m=28; m<83; m++)
  942.   {
  943.   xm= 96.0 +(m-28) * 32.0;
  944.   dx = xm-x;
  945.   if (dx<0){dx=-dx;}
  946.   if (dx < (32.0/2) )
  947.   {
  948.   // encadrement_note(m);
  949.   return m;
  950.   }
  951.   }
  952.   return 0;
  953. }
  954. */
  955.  
  956. int MW::calcul_num_midi(double x) // en fonction de la position horizontale dans le tableau d'affichage de la FFT
  957. {
  958. // on va détecter la note la plus proche de la position donnée
  959. // rappel : x=92 +(m-40) * 40.9 (voir la fonction : 'tracer_graduations_FFT()')
  960.  
  961. double dx;
  962. double xm;
  963.  
  964. for (int m=40; m<84; m++)
  965. {
  966. xm= 92.0 +(m-40) * 40.9;
  967. dx = xm-x;
  968. if (dx<0){dx=-dx;}
  969. if (dx < (40.9/2) )
  970. {
  971. encadrement_note(m);
  972. return m;
  973. }
  974. }
  975. return 0;
  976. }
  977.  
  978.  
  979. void MW::saisie_clavier(int midi)
  980. {
  981. QString s1,s3;
  982. on_Bt_AddLine_clicked();
  983.  
  984. s1.setNum(midi);
  985.  
  986. int h1 = calcul_hauteur_note(midi); // h1 = 0..11
  987. if(h1<0){h1+=12;}
  988. if(h1>11){h1-=12;}
  989. s3 = " " + gamme_chromatique_d[h1];
  990. s1 += s3;
  991.  
  992. QColor couleur_case = liste_couleurs[h1];
  993.  
  994. int R=TW_3->rowCount();
  995. complete_case(R-1, 1, s1, "#000000", couleur_case, false, TW_3); // midi & note
  996. // complete_case(R-1, 7, "4", "#000000", couleur_case, false, TW_3);
  997. TW_3->setItem(R-1, 7, new QTableWidgetItem ("4") ); // durée
  998.  
  999. TW_3->resizeColumnsToContents();
  1000. }
  1001.  
  1002.  
  1003. void MW::play_note(int midi) // sortie audio; duree en nb de barres
  1004. {
  1005. if (notes_silencieuses == true) {return ;}
  1006.  
  1007. QString s1, freq_txt;
  1008. calcul_hauteur_note(midi);
  1009. s1.setNum(midi);
  1010.  
  1011. lineEdit_6->setText(s1);
  1012. lineEdit_n_midi->setText(s1);
  1013.  
  1014. float freq = freq_mid(midi-12);
  1015. freq_txt.setNum(freq,'f', 2);
  1016. lineEdit_freq->setText(freq_txt+" Hz");
  1017.  
  1018. // fichiers audio comprenant une seule note chacun, voir dans le dossier "notes"
  1019.  
  1020. if (checkBox_long->isChecked()) { s1="notes_longues/"+s1+".wav"; } // (notes2 = notes +10dB)
  1021. else { s1="notes2/"+s1+".wav"; }
  1022.  
  1023. if (n_player == 1) {player1->stop(); player1->setSource(QUrl::fromLocalFile(s1)); player1->play();}
  1024. if (n_player == 2) {player2->stop(); player2->setSource(QUrl::fromLocalFile(s1)); player2->play();}
  1025. if (n_player == 3) {player3->stop(); player3->setSource(QUrl::fromLocalFile(s1)); player3->play();}
  1026. if (n_player == 4) {player4->stop(); player4->setSource(QUrl::fromLocalFile(s1)); player4->play();}
  1027. if (n_player == 5) {player5->stop(); player5->setSource(QUrl::fromLocalFile(s1)); player5->play();}
  1028. n_player++;
  1029. if (n_player > 5) {n_player = 1;} // voir ligne 4013 RAZ du n° player, à voir
  1030. }
  1031.  
  1032.  
  1033.  
  1034.  
  1035. void MW::effacer_calque(QGraphicsScene *scene_i, QGraphicsItemGroup *calque_i)
  1036. {
  1037. foreach( QGraphicsItem *item, scene_i->items( calque_i->boundingRect() ) )
  1038. {if( item->group() == calque_i ) { delete item; }}
  1039. }
  1040.  
  1041.  
  1042. MW::~MW()
  1043. {
  1044.  
  1045. }
  1046.  
  1047.  
  1048.  
  1049. void MW::Etiquette(int x, int y, int dx, QString s, QString coul_txt, QString coul_fond, QString coul_bord, QGraphicsItemGroup *calque_i )
  1050. {
  1051. // si dx = 0 -> la largeur sera fonction du nb de caractères
  1052.  
  1053. if (dx==0)
  1054. {
  1055. dx = 8 * (s.length()+1 );
  1056. }
  1057. rect1 = new QGraphicsRectItem(x, y+4, dx, 18);
  1058. rect1->setPen(QColor(coul_bord)); // bordure
  1059. rect1->setBrush(QColor(coul_fond)); // fond
  1060. calque_i->addToGroup(rect1);
  1061.  
  1062. //texte
  1063. GraphicsTextItem = new QGraphicsTextItem(s);
  1064. GraphicsTextItem->setPos(x, y);
  1065. GraphicsTextItem->setDefaultTextColor(coul_txt);
  1066. calque_i->addToGroup(GraphicsTextItem);
  1067. }
  1068.  
  1069.  
  1070.  
  1071. void MW::tracer_graduations_FFT() // sur onglet 'Source wav'
  1072. {
  1073. double x=0;
  1074. QString s1;
  1075. int y_bas =450; // 350
  1076.  
  1077. // cadre
  1078. rectangle1 = new QGraphicsRectItem(0, 0, 1900, y_bas);
  1079. QPen pen1("#12FF00");
  1080. rectangle1->setPen(pen1);
  1081.  
  1082. calque_reticule1->addToGroup(rectangle1);
  1083.  
  1084. s1 = "midi :"; // numéro midi
  1085. GraphicsTextItem = new QGraphicsTextItem(s1);
  1086. GraphicsTextItem->setDefaultTextColor("#FFFFFF");
  1087. GraphicsTextItem->setPos(30, 20);
  1088. // if(x<1900)
  1089. {
  1090. calque_reticule1->addToGroup(GraphicsTextItem);
  1091. }
  1092.  
  1093. // positions des notes midi
  1094. x= 96;
  1095. // for(int m=28; m<=83; m++)
  1096. for(int m=40; m<=83; m++)
  1097. {
  1098. ligne1 = new QGraphicsLineItem(x, 70, x, y_bas);
  1099. ligne1->setPen(pen_reticule);
  1100. calque_reticule1->addToGroup(ligne1);
  1101.  
  1102. s1.setNum(m); // numéro midi
  1103. GraphicsTextItem = new QGraphicsTextItem(s1);
  1104. GraphicsTextItem->setDefaultTextColor("#D3D7CF");
  1105. GraphicsTextItem->setPos(x-15, 20);
  1106. if(x<1900) {calque_reticule1->addToGroup(GraphicsTextItem); }
  1107.  
  1108. int h1 = calcul_hauteur_note(m);
  1109.  
  1110. s1 = " " + gamme_chromatique_b[h1]; // nom de la note
  1111. GraphicsTextItem = new QGraphicsTextItem(s1);
  1112. GraphicsTextItem->setDefaultTextColor(liste_couleurs[h1]);
  1113. GraphicsTextItem->setPos(x-18, 40);
  1114. if(x<1900) {calque_reticule1->addToGroup(GraphicsTextItem); }
  1115.  
  1116. //x+=32.0; // espacement des graduation
  1117. x+=40.9; // espacement des graduation
  1118. }
  1119. }
  1120.  
  1121.  
  1122. // voir fonction "void MW::tracer_echelle_temps_TAB_NOTES()"
  1123. // dx = 1000.0 * pas_echantillonage/256.0; // = 1000 * 24 /256 = 93.75
  1124.  
  1125.  
  1126. double MW:: calcul_pas_grille()
  1127. {
  1128. double pas = 0;
  1129. if (mode == 'T')
  1130. {
  1131. pas = 1000.0 * pas_echantillonage/256.0 / 40.0 * zoom_x; // 1 barre toutes les 1/40 seconde
  1132. }
  1133. if (mode == 'M')
  1134. {
  1135. pas = (doubleSpinBox_dxb->value()) * 1000.0 * pas_echantillonage/256.0 / 40.0 * zoom_x;
  1136. }
  1137. return pas;
  1138. }
  1139.  
  1140. /*
  1141. double MW::calcul_pas_grille_M()
  1142. {
  1143.   double pas_grille_M = (spinBox_dxa->value()+doubleSpinBox_dxb->value()) * 1000.0 * pas_echantillonage/256.0 / 40.0 * zoom_x;
  1144.   return pas_grille_M;
  1145. }
  1146. */
  1147.  
  1148. int MW::calcul_tempo()
  1149. {
  1150. double dbar = doubleSpinBox_dxb->value(); // nb de barres de 1/40s séparant 2 barres de mesure
  1151. double dt = (8.0/40.0) * dbar; // en s
  1152. double nb_bpm = 60.0 / dt; // nb de barres / mn
  1153. //double Tp = nb_bpm / 8.0;
  1154. return int(nb_bpm);
  1155. }
  1156.  
  1157.  
  1158.  
  1159. double MW::calcul_x_barre(int n_barre)
  1160. {
  1161. // calcul de l'abscisse (en pixel) d'une barre de mesure
  1162. double x =0;
  1163. double x0;
  1164.  
  1165. int x0a = spinBox_x0a->value();
  1166. double x0b = 80.0 + 10.0 * doubleSpinBox_x0b->value(); // 80
  1167. x0b += 20.0 * x0a;
  1168.  
  1169. if (mode == 'T')
  1170. {
  1171. x0 = 80.0; // 80 à voir !
  1172. x = x0 + double(n_barre) * calcul_pas_grille();
  1173. }
  1174. if (mode == 'M')
  1175. {
  1176. x = x0b + double(n_barre) * calcul_pas_grille();
  1177. }
  1178. return x;
  1179. }
  1180.  
  1181. /*
  1182. double MW::calcul_x_barre_M(int n_barre)
  1183. {
  1184.   double x = double(n_barre) * calcul_pas_grille_M();
  1185.   return x;
  1186. }
  1187. */
  1188.  
  1189. void MW::trace_1_barre_M(double x_i, QString couleur_i)
  1190. {
  1191. if(x_i<0) {return;} // pour ne pas décaler tout l'affichage
  1192. QPen pen_i;
  1193. pen_i.setColor(couleur_i);
  1194. ligne1 = new QGraphicsLineItem(x_i, 0.0, x_i, 700.0);
  1195. ligne1->setPen(pen_i);
  1196. calque_grille_M->addToGroup(ligne1);
  1197. }
  1198.  
  1199.  
  1200. void MW::tracer_grille_M()
  1201. {
  1202. effacer_calque(scene4, calque_echelle_temporelle_M);
  1203. double x1;
  1204. int num_temps=0;
  1205. QString s1;
  1206. QPen pen1;
  1207. QString couleur1;
  1208.  
  1209. QString gris_clair = "#888888";
  1210. QString gris_fonce = "#444444";
  1211. //QString gris_tres_fonce = "#222222";
  1212. QString jaune = "#FFFF00";
  1213. QString cyan = "#00FFFF";
  1214. int num_mesure=0;
  1215. int us2=0; // une sur 2
  1216. for(int32_t n=-100; n<=8000; n++)
  1217. {
  1218. // rappel : mesures type Ta/Tb dans le petit tableau 'Type Mesures'
  1219. // 3/4 -> Ta=3 & Tb=4
  1220. // 4/4 -> Ta=4 & Tb=4
  1221. x1 = calcul_x_barre(n);
  1222. if (x1>70)
  1223. {
  1224.  
  1225. couleur1 = gris_clair; // à priori
  1226. if (n%(4*Ta) == 0)
  1227. {
  1228. if(x1<0){num_mesure= -1;}
  1229. num_mesure++;
  1230. if(num_mesure>0)
  1231. {
  1232. couleur1 = cyan; us2 =0;
  1233. s1.setNum(num_mesure);
  1234. Etiquette(x1, 10, 0, s1, "#FFFFFF", "#000000", "#00FFFF", calque_echelle_temporelle_M ); // en haut
  1235. }
  1236. }
  1237. if ((Ta==4) && (1) && (num_mesure<10) && (n%(Ta/2) == 0) && (checkBox_numerotation->isChecked()))
  1238. {
  1239. // numérotation des temps au sein de chaque mesure
  1240. num_temps = n/(Ta/2);
  1241. if ((num_temps>=0) && (num_temps<80)) // <8
  1242. {
  1243. int dy =0;
  1244. int nt2 =num_temps/2;
  1245. nt2 = nt2 %4;
  1246. s1.setNum(nt2 + 1);
  1247. if(num_temps%2 == 1)
  1248. {
  1249. s1 = "&";
  1250. dy = 10;
  1251. }
  1252. Etiquette(x1, 400-dy, 0, s1, "#FFFFFF", "#000000", "#444444", calque_echelle_temporelle_M );// au milieu
  1253. }
  1254. }
  1255. us2++;
  1256. if ((us2 %2)==0) { couleur1 = gris_fonce; }
  1257. if(n==0){couleur1 = jaune;}
  1258. trace_1_barre_M(x1, couleur1); // principale
  1259. }
  1260. }
  1261.  
  1262. for(int n=0; n<58; n++) // 57 = 86-28
  1263. {
  1264. // lignes horizontales
  1265. int y = 11 + 12*n;
  1266. ligne1 = new QGraphicsLineItem(70, y, 32000, y); // 12000
  1267. pen1.setColor("#555555");
  1268. ligne1->setPen(pen1);
  1269. calque_grille_T->addToGroup(ligne1);
  1270. }
  1271.  
  1272.  
  1273. double Tempo = calcul_tempo();
  1274. s1.setNum(Tempo);
  1275. lineEdit_11->setText(s1); // BPM
  1276.  
  1277. // Etiquette(0, 0, 0, s1, "#FFFFFF", "#000000", "#FF00FF", calque_echelle_temporelle_T );
  1278. // s1 = "BPM";
  1279.  
  1280. /*
  1281.   GraphicsTextItem = new QGraphicsTextItem(s1);
  1282.   GraphicsTextItem->setPos(45, 0);
  1283.   GraphicsTextItem->setDefaultTextColor("#FF00FF");
  1284.   calque_echelle_temporelle_T->addToGroup(GraphicsTextItem);
  1285. */
  1286.  
  1287. }
  1288.  
  1289.  
  1290. void MW::tracer_grille_T()
  1291. {
  1292. //grille T sur l'onglet NOTES (barres verticales)
  1293. QString s1;
  1294. // QString bleu_clair = "#00AAFF";
  1295. // QString jaune = "#FFFF00";
  1296. QString gris_clair = "#CCCCCC";
  1297. QString gris_fonce = "#777777";
  1298. QString gris_tres_fonce = "#444444";
  1299. QString couleur_i;
  1300. QPen pen_i;
  1301. double x_i1;
  1302. //int num_mesure;
  1303. int nb = spinBox_nb_barres->value();
  1304. int n_zero = spinBox_barre_zero->value();
  1305.  
  1306. for(int32_t n=0; n<=427*16; n++)
  1307. {
  1308. if (Ta<2) {Ta=2;}
  1309. x_i1 = calcul_x_barre(n);
  1310.  
  1311. couleur_i = gris_tres_fonce; // à priori
  1312.  
  1313. if (((n-n_zero)%nb) == 0) { couleur_i ="#00AAAA"; } //couleur_i = gris_fonce;
  1314. /*
  1315.   if ( n%(4*Ta) == 0) // 1er temps fort de la mmesure
  1316.   {
  1317. // numérotation des mesures, en bas, chiffres jaunes
  1318.   num_mesure = n /Ta/4;
  1319.   s1.setNum(num_mesure);
  1320.   Etiquette(x_i1-0, 0, 650, s1, "#FFFF00", "#000000", "#0000FF", calque_grille_T);
  1321.   }
  1322. */
  1323. //if ( n%(4*m)== 0) {couleur_i = jaune;}
  1324.  
  1325. pen_i.setColor(couleur_i);
  1326. ligne1 = new QGraphicsLineItem(x_i1, 0.0, x_i1, 700.0); //100.0 pour test des 2 grilles ensemble
  1327. ligne1->setPen(pen_i);
  1328. calque_grille_T->addToGroup(ligne1);
  1329. }
  1330.  
  1331. // lignes horizontales
  1332.  
  1333. for(int n=0; n<=58; n++) // 57 = 86-28
  1334. {
  1335. int y = 11 + 12*n;
  1336. ligne1 = new QGraphicsLineItem(70, y, 32000, y);
  1337. pen_i.setColor("#555555");
  1338. ligne1->setPen(pen_i);
  1339. calque_grille_T->addToGroup(ligne1);
  1340. }
  1341. }
  1342.  
  1343.  
  1344. void MW::afficher_titre_calque(QString titre, int x, int y, QGraphicsItemGroup *calque_i)
  1345. {
  1346. GraphicsTextItem = new QGraphicsTextItem(titre);
  1347. GraphicsTextItem->setDefaultTextColor("#FFFFFF");
  1348. GraphicsTextItem->setPos(x, y);
  1349. calque_i->addToGroup(GraphicsTextItem);
  1350. }
  1351.  
  1352.  
  1353.  
  1354. void MW::tracer_graduation_TAB_NOTES() // midi ; en colonne à gauche + noms des notes
  1355. {
  1356. // positions des notes midi
  1357. QString s1;
  1358. int y= 0; //0
  1359.  
  1360. rectangle3 = new QGraphicsRectItem(0, 0, 70, 710);
  1361. QPen pen1("#FFFFFF");
  1362. QColor couleur1(0, 0, 0, 255); // fond noir + canal alpha (255) qui force l'effacement (des graduations)
  1363. QBrush brush1(couleur1);
  1364. rectangle3->setPen(pen1);
  1365. rectangle3->setBrush(brush1);
  1366. calque_noms_notes->addToGroup(rectangle3);
  1367.  
  1368. for(int m=86; m>=28; m--)
  1369. {
  1370. //ligne1 = new QGraphicsLineItem(100, 0, 100, 350);
  1371. //ligne1->setPen(pen_reticule);
  1372. //calque_reticule1->addToGroup(ligne1);
  1373.  
  1374. s1.setNum(m); // numéro midi
  1375. GraphicsTextItem = new QGraphicsTextItem(s1);
  1376. GraphicsTextItem->setDefaultTextColor("#D3D7CF");
  1377. GraphicsTextItem->setFont(QFont("Arial", 8));
  1378. GraphicsTextItem->setPos(0, y);
  1379. if(y> -50) {calque_noms_notes->addToGroup(GraphicsTextItem); }
  1380.  
  1381. int h1 = calcul_hauteur_note(m);
  1382. s1 = " " + gamme_chromatique_b[h1]; // nom de la note
  1383. GraphicsTextItem = new QGraphicsTextItem(s1);
  1384. GraphicsTextItem->setDefaultTextColor(liste_couleurs[h1]);
  1385. GraphicsTextItem->setFont(QFont("Arial", 8));
  1386. // GraphicsTextItem->setHtml("<div style='background-color:#666666;'>" + s1 + "</div>");
  1387.  
  1388. if (m==69) // La 440
  1389. {
  1390. rect3 = new QGraphicsRectItem(30, y+6, 40, 10);
  1391. QBrush br2;
  1392. QPen pen_i;
  1393. pen_i.setColor("#AAAAAA");
  1394. rect3->setPen(pen_i);
  1395. calque_noms_notes->addToGroup(rect3);
  1396. }
  1397.  
  1398. GraphicsTextItem->setPos(30, y);
  1399. if(y > -50) {calque_noms_notes->addToGroup(GraphicsTextItem); }
  1400.  
  1401. y+=12; //16 espacement des graduations
  1402. }
  1403. GV_grillesTM->verticalScrollBar()->setValue(0);
  1404. }
  1405.  
  1406.  
  1407.  
  1408. void MW::tracer_graduations_signal() // sur le 1er onglet (Source.wav)
  1409. {
  1410. /*
  1411.   midi57 = 110Hz
  1412.   1/110Hz = 9ms -> delta x = 142-46 = 96px
  1413.   echelle x = 96/9 = 10.6 px/ms
  1414.   soit:
  1415.   10ms -> 106px
  1416. */
  1417. double x;
  1418. double nb_grad_max;
  1419. double intervalle; // séparant les graduations
  1420. QPen pen1;
  1421. // int num_x;
  1422. //QString sti;
  1423. // uint decal = 3; // leger decallage vertical pour ne pas masquer la trace
  1424.  
  1425. /*
  1426.   rectangle1 = new QGraphicsRectItem(5, 452, 1900, 200);
  1427.   pen1.setColor("#0073FF");
  1428.   rectangle1->setPen(pen1);
  1429.   calque_reticule1->addToGroup(rectangle1);
  1430.  
  1431.   ligne1 = new QGraphicsLineItem(10, 475, 1900, 475); // ligne horizontale
  1432.   pen1.setColor("#0073FF");
  1433.   ligne1->setPen(pen1);
  1434.   calque_reticule1->addToGroup(ligne1);
  1435. */
  1436. afficher_titre_calque("Partie échantillonée du signal", 0, 452, calque_reticule1);
  1437.  
  1438. // lignes verticales
  1439.  
  1440. intervalle = 106;
  1441. nb_grad_max = 18;
  1442.  
  1443. for (int i=0; i<=nb_grad_max; i++)
  1444. {
  1445. x = intervalle * i;
  1446.  
  1447. ligne1 = new QGraphicsLineItem(x, 452, x, 780);
  1448. ligne1->setPen(pen_reticule);
  1449. }
  1450.  
  1451. /*
  1452. // lignes horizontales
  1453.   intervalle = 55;
  1454.   nb_grad_max = 3;
  1455.   for (i=0; i<=nb_grad_max; i++)
  1456.   {
  1457.   y = 300 - intervalle * i;
  1458.  
  1459.   ligne1 = new QGraphicsLineItem(0, y, 1350, y);
  1460.   ligne1->setPen(pen_reticule);
  1461.   calque_reticule1->addToGroup(ligne1);
  1462.   }
  1463.   texte_mid = new QGraphicsTextItem("Silicium628");
  1464.   texte_mid->setDefaultTextColor(couleur_signature);
  1465.   texte_mid->setPos(5,5);
  1466.   calque_reticule1->addToGroup(texte_mid);
  1467.  */
  1468.  
  1469. scene1->addItem(calque_reticule1);
  1470. }
  1471.  
  1472.  
  1473.  
  1474. void MW::tracer_gradu_temporelle_signal_entree()
  1475. {
  1476. // GRADUATION TEMPORELLE sur le signal d'entrée, en secondes; (scene2 sur onglet 'Source wav')
  1477.  
  1478. QString s1, s2;
  1479. int x=0;
  1480. int dy = 75;
  1481. int nb_s, nb_mn;
  1482. double pas =8;
  1483.  
  1484. for(int n=0; n<2400; n++) // 1200
  1485. {
  1486.  
  1487. if (n%10 == 0) { dy = 75; }
  1488. else if (n%5 == 0) {dy = 20; }
  1489. else {dy = 10;}
  1490.  
  1491. x = n *pas;
  1492. ligne1 = new QGraphicsLineItem(x, -dy, x, dy);
  1493. QPen P1("#AAAAAA");
  1494. ligne1->setPen(P1);
  1495. calque_reticule2->addToGroup(ligne1);
  1496.  
  1497. if (n%10 == 0)
  1498. {
  1499. nb_s = n/10;
  1500. s1.setNum(nb_s);
  1501. s1+="s";
  1502.  
  1503. if (nb_s>60)
  1504. {
  1505. nb_mn = nb_s/60;
  1506. nb_s -= nb_mn * 60;
  1507. s1.setNum(nb_s);
  1508. if (nb_s<10) {s1 = "0" +s1;}
  1509. s2.setNum(nb_mn);
  1510. s1 = s2 + ":" + s1;
  1511. }
  1512. GraphicsTextItem = new QGraphicsTextItem(s1);
  1513. GraphicsTextItem->setDefaultTextColor(couleur_texte);
  1514. GraphicsTextItem->setPos(x,55);
  1515. if(x<20000) {calque_reticule2->addToGroup(GraphicsTextItem); }//6000
  1516. }
  1517. }
  1518. }
  1519.  
  1520.  
  1521.  
  1522. void MW::tracer_signal_complet() // totalité du fichier wav (dans le cadre du bas du 1er onglet)
  1523. {
  1524. uint8_t octet_n=0;
  1525. double R;
  1526.  
  1527. double offset_y = 0.0;
  1528. double echelle_y =doubleSpinBox_gain->value();
  1529. double echelle_x =0.2;
  1530.  
  1531. int x, y, memo_x, memo_y;
  1532. double min= 1000000.0;
  1533. double max=-1000000.0;
  1534.  
  1535. int pas = 10 * pas_echantillonage; // 240;
  1536.  
  1537. //rappel : duree_totale = data_size / 96000;
  1538.  
  1539. // le signal wav est échantillonné à l'origine à 96000 Bps (séréo 2*fois 48000 Bps)
  1540. // en ne prenant qu'un octet sur 24 on obtient 4000 Bps.
  1541. QString s1;
  1542.  
  1543. effacer_calque(scene2, calque_trace_signal2 );
  1544. segment_trace = new QGraphicsLineItem(0, offset_y, 512, offset_y);
  1545. QPen P1("#0000FF");
  1546. segment_trace->setPen(P1); //couleur_ligne
  1547. calque_trace_signal2->addToGroup(segment_trace);
  1548.  
  1549. x=0;
  1550. y=offset_y;
  1551.  
  1552. double n_max=1;
  1553. if (pas !=0) {n_max = data_size / pas;}
  1554.  
  1555. long n;
  1556. long i=0;
  1557. // int j=0;
  1558.  
  1559. for(n=0; n<n_max; n+=10)
  1560. {
  1561. memo_x = x;
  1562. memo_y = y;
  1563. x = echelle_x * n;
  1564. if (i < 2000000)
  1565. {
  1566. octet_n = temp_data[i]; // canal 1}
  1567. }
  1568. R = octet_n - 128; // pour ôter la composante continue propre au codage par des octets non signés
  1569. R *= echelle_y;
  1570. R *= doubleSpinBox_gain->value();
  1571. y=offset_y + R;
  1572.  
  1573. // recherche du mini-maxi:
  1574. if (y < min) {min = y;}
  1575. if (y > max) {max = y;}
  1576.  
  1577. //if (x<3000) //3000
  1578. {
  1579. segment_trace = new QGraphicsLineItem(memo_x ,memo_y, x, y);
  1580. QPen P1("#0055FF");
  1581. segment_trace->setPen(P1);
  1582. calque_trace_signal2->addToGroup(segment_trace);
  1583. }
  1584.  
  1585. i+= pas; // le nb de pas étant pair, on retombe toujours sur le même canal (droite ou gauche)
  1586. }
  1587. //scene1->addItem(calque_trace_signal);
  1588. s1.setNum(min);
  1589. //lineEdit_4->setText(s1);
  1590. s1.setNum(max);
  1591. // lineEdit_5->setText(s1);
  1592. }
  1593.  
  1594.  
  1595.  
  1596. void MW::encadrement_signal(int x, int dx)
  1597. {
  1598. ligne1 = new QGraphicsLineItem(x, -80, x, 80);
  1599. ligne1->setPen(pen_encadrement);
  1600. calque_encadrement2->addToGroup(ligne1);
  1601.  
  1602. ligne1 = new QGraphicsLineItem(x+dx, -80, x+dx, 80);
  1603. ligne1->setPen(pen_encadrement);
  1604. calque_encadrement2->addToGroup(ligne1);
  1605.  
  1606. ligne1 = new QGraphicsLineItem(x, -80, x+dx, -80);
  1607. ligne1->setPen(pen_encadrement);
  1608. calque_encadrement2->addToGroup(ligne1);
  1609.  
  1610. ligne1 = new QGraphicsLineItem(x, 80, x+dx, 80);
  1611. ligne1->setPen(pen_encadrement);
  1612. calque_encadrement2->addToGroup(ligne1);
  1613. }
  1614.  
  1615.  
  1616.  
  1617. void MW::encadrement_note(int n_midi) // par un rectangle sur l'onglet 'Source wav'
  1618. {
  1619. double x, dx, y, dy;
  1620.  
  1621. x=92 - 13 + ((double)n_midi-40.0) * 40.9;
  1622. dx=35;
  1623. y=16;
  1624. dy=50;
  1625.  
  1626. rectangle1 = new QGraphicsRectItem(x, y, dx, dy);
  1627. rectangle1->setPen(pen_encadrement);
  1628. calque_trace_FFT->addToGroup(rectangle1);
  1629. }
  1630.  
  1631.  
  1632.  
  1633. void MW::tracer_signal_a_convertir() //partie à analyser s=f(t) (signal incident, pas le FFT); dans le cadre du haut
  1634. {
  1635. double offset_y = 575.0;
  1636. double echelle =5.0;
  1637. uint8_t octet_n;
  1638. double R;
  1639. double x, y, memo_x, memo_y;
  1640. double min= 1000000.0;
  1641. double max=-1000000.0;
  1642. QString s1;
  1643.  
  1644. effacer_calque(scene1,calque_trace_signal1 );
  1645. segment_trace = new QGraphicsLineItem(0, offset_y, 512, offset_y);
  1646. segment_trace->setPen(QColor(couleur_ligne));
  1647. calque_trace_signal1->addToGroup(segment_trace);
  1648.  
  1649. long n;
  1650. long i=0;
  1651. x=0;
  1652. y=offset_y;
  1653. int pas = 64;
  1654. for(n=0; n<nb_ech/2; n++)
  1655. {
  1656. memo_x = x;
  1657. memo_y = y;
  1658. x = echelle * n;
  1659.  
  1660. octet_n = temp_data[i]; // canal 1
  1661. R = octet_n - 128; // pour oter la composante continue propre au codage par des octets non signés
  1662. // R /= 10.0;
  1663. y=offset_y + R;
  1664.  
  1665. if (y < min) {min = y;}
  1666. if (y > max) {max = y;}
  1667.  
  1668. if (x<1800)
  1669. {
  1670. segment_trace = new QGraphicsLineItem(memo_x ,memo_y, x, y);
  1671. segment_trace->setPen(pen_trace1);
  1672. calque_trace_signal1->addToGroup(segment_trace);
  1673. }
  1674.  
  1675. i++; // pour sauter le canal B (le signal dans le fichier .wav est stéréo)
  1676. i+= pas;
  1677. }
  1678. //scene1->addItem(calque_trace_signal);
  1679. s1.setNum(min);
  1680. //lineEdit_4->setText(s1);
  1681. s1.setNum(max);
  1682. // lineEdit_5->setText(s1);
  1683. }
  1684.  
  1685.  
  1686. void rainbow_color(float t, float *r, float *g, float *b) // fonction fournie par ChatGPT !! pas top : trop de vert
  1687. {
  1688. // t doit être un float (réel) quelconque, on garde la partie fractionnaire
  1689. float hue = fmodf(t, 1.0);
  1690. if (hue < 0) hue += 1.0; // pour gérer les valeurs négatives
  1691.  
  1692. float h = hue * 5.2; // 6.0 // hue ∈ [0,1] → h ∈ [0,6]
  1693. int i = (int)h;
  1694. float f = h - i;
  1695. float q = 1.0 - f;
  1696.  
  1697. switch (i % 6)
  1698. {
  1699. case 0: *r = 1; *g = f; *b = 0; break;
  1700. case 1: *r = q; *g = 1; *b = 0; break;
  1701. case 2: *r = 0; *g = 1; *b = f; break;
  1702. case 3: *r = 0; *g = q; *b = 1; break;
  1703. case 4: *r = f; *g = 0; *b = 1; break;
  1704. case 5: *r = 1; *g = 0; *b = q; break;
  1705. }
  1706. }
  1707.  
  1708.  
  1709.  
  1710. void MW::tracer_1_ligneV_primaire_FFT() // sur l'onglet 'FFT'
  1711. {
  1712.  
  1713. //double offset_x= spinBox_offset->value();
  1714. //double echelle_x =doubleSpinBox_echx->value();
  1715. double module_FFT;
  1716. double x=0, y=0;
  1717. double z=1.6;
  1718. float r, g, b;
  1719.  
  1720. for(uint32_t n=0; n<nb_ech/2; n++) // c.a.d 1 cluster de 1024 échantillons. -> à représenter sur 1 ligne verticale
  1721. {
  1722. // la division /2 dans la boucle ci-dessus sert à éliminer les fréquences images (la transformée de Fourier est symétrique...)
  1723.  
  1724. module_FFT = sqrt( tab_X[n].a * tab_X[n].a + tab_X[n].b * tab_X[n].b ); // z * racine(a²+b²)
  1725.  
  1726. x = 2 * x_ligne_FFT; // position horizontale de [la ligne verticale affichant 1 cluster de 1024 échantillons]
  1727.  
  1728. int pA = spinBox_A->value(); // params manuels
  1729. int pB = spinBox_B->value();
  1730. int pC = spinBox_C->value();
  1731.  
  1732. y = 10.0* pA - pB * log2((double)(n+pC)); // échelle logarithmique afin que les tons soient graphiquement équi-espacés
  1733. y *= (spinBox_D->value()/10.0);
  1734.  
  1735. rainbow_color(1.0-(y/900.0), &r, &g, &b);
  1736.  
  1737. double A = 0.2 * module_FFT;
  1738. A= A * A * A; // au cube... à voir... pour augmenter la résolution fréquentielle (visuelle)
  1739. //A *= 20.0; //2
  1740.  
  1741. if (A>255){A=255;}
  1742.  
  1743. QColor couleur1 = QColor::fromRgb(255*r, 255*g, 255*b, A); // A = luminance du point
  1744. QPen pen1(couleur1);
  1745. pen1.setWidth(1);
  1746. painter1.setPen(pen1);
  1747. painter1.drawPoint(x, y);
  1748.  
  1749. }
  1750. label_image_FFT->setPixmap(QPixmap::fromImage(image1));
  1751.  
  1752. x_ligne_FFT ++;
  1753. }
  1754.  
  1755.  
  1756.  
  1757. void MW::tracer_segments_FFT() //scene1 sur le 1er onglet (Source wav);
  1758. {
  1759. //traite 1 cluster de 1024 échantillons
  1760.  
  1761. double offset_x= spinBox_offset->value(); // ref -2146 ; +/- 22 pour un décalage de +/-1/4 de ton
  1762. double echelle_x =doubleSpinBox_echx->value(); // 498
  1763. double offset_y = 350.0;
  1764.  
  1765. uint n;
  1766. double module_FFT;
  1767. double x=0, y=0;
  1768. // double dx;
  1769. double memo_x[5]={0,0,0,0,0};
  1770. double memo_y[5]={0,0,0,0,0};
  1771. double x0, y0; // fréquence centrale trouvée comme résultat (points d'inflexions de la courbe)
  1772.  
  1773. double z=1.6;
  1774. //int x1=0;
  1775. //int x2=0;
  1776. int num_raie=0;
  1777. //bool note_validee = false;
  1778.  
  1779.  
  1780. QPen pen1("#12FF00");
  1781.  
  1782. if(!rapide)
  1783. {
  1784. effacer_calque(scene1, calque_trace_FFT );
  1785. // effacer_calque(scene1,calque_lignes_F_zero ); // non ! hyper-lent
  1786. }
  1787.  
  1788.  
  1789. y = offset_y;
  1790. ENR_FFT enr_i;
  1791.  
  1792. //qDebug() << "nb_ech" << nb_ech; // 1024
  1793. //x=0.0;
  1794. //dx = 30.0;
  1795. for(n=0; n<nb_ech; n++)
  1796. {
  1797. //note_validee = false;
  1798. memo_x[0] = x;
  1799. memo_y[0] = y;
  1800.  
  1801. //x = 100 + 6.0 * n; // echelle linéaire -> pas top
  1802. x = offset_x + echelle_x * log2((double)(n+1)); // échelle logarithmique afin que les tons soient graphiquement équi-espacés
  1803.  
  1804. // x += dx;
  1805.  
  1806. // ci-dessous 'a' est la partie réelle du complexe, et 'b' la partie imaginaire
  1807. // on calcule le module :
  1808. module_FFT = z * sqrt( tab_X[n].a * tab_X[n].a + tab_X[n].b * tab_X[n].b ); // z * racine(a²+b²)
  1809.  
  1810. y = module_FFT*10.0; // amplitude
  1811. y = offset_y - y; // offset et inversion du sens d'affichage because à l'écran les y croissent de haut en bas
  1812.  
  1813.  
  1814. // décale la pile memo_x
  1815. // puis mise en mémoire (empile) le dernier point
  1816. memo_x[4] = memo_x[3]; memo_y[4] = memo_y[3];
  1817. memo_x[3] = memo_x[2]; memo_y[3] = memo_y[2];
  1818. memo_x[2] = memo_x[1]; memo_y[2] = memo_y[1];
  1819. memo_x[1] = memo_x[0]; memo_y[1] = memo_y[0];
  1820. memo_x[0] = x;
  1821. memo_y[0] = y;
  1822.  
  1823. if((x>20) && (x<1900))
  1824. {
  1825. //y *=1.0;
  1826. if (x > -100)
  1827. {
  1828. if (!rapide)
  1829. {
  1830. segment_trace = new QGraphicsLineItem(memo_x[1], memo_y[1], x, y);
  1831. segment_trace->setPen(pen_trace2);
  1832. calque_trace_FFT->addToGroup(segment_trace);
  1833. }
  1834. }
  1835.  
  1836. // DETECTION DES NOTES primaires
  1837.  
  1838. //----------------------------------------------------------------------------------
  1839. // détection direct des points hauts (points d'inflexion de la courbe)
  1840. // on pourrait calculer la dérivée de la courbe, et détecter les valeurs pour lesquelles elle s'annule
  1841. // problème : peut ne pas détecter si le sommet est un pic (discontinuité)
  1842. //----------------------------------------------------------------------------------
  1843.  
  1844. // Autre méthode :
  1845. // détection de 2 doublets de points de part et d'autre, montants puis descendant
  1846. // le sommet se situe donc entre les 2 doublets
  1847.  
  1848. // la DETECTION s'effectue ICI
  1849.  
  1850. // ATTENTION : la ligne qui suit détermine la stratégie utilisée et son paramétrage influe grandement
  1851. // sur la qualité du résultat.
  1852. // on doit pouvoir l'améliorer mais attention : toujours expérimenter sur des données réelles (air de musique)
  1853. // avant de valider la moindre "amélioration".
  1854.  
  1855. //if ( (memo_y[3] - memo_y[2]) >0.5 && (memo_y[1] - memo_y[2]) >0.5 )
  1856.  
  1857. if ( (memo_y[3] - memo_y[2]) > 1.1 && (memo_y[1] - memo_y[2]) > 1.1 )
  1858. {
  1859. x0 = memo_x[2]; // point d'inflexion probable
  1860. y0 = memo_y[2];
  1861. // x0 = (memo_x[0]+ memo_x[1]+ memo_x[2]+ memo_x[3] + memo_x[4]) / 5.0;
  1862.  
  1863. if( !rapide) // donc pas d'affichage en mode rapide
  1864. {
  1865. ligne1 = new QGraphicsLineItem(x0, 60, x0, 350);
  1866. ligne1->setPen(pen1);
  1867. calque_lignes_F_zero->addToGroup(ligne1);
  1868.  
  1869. // ligne1 = new QGraphicsLineItem(x0+1, 60, x0+1, 350); // pour épaissir le trait
  1870. // ligne1->setPen(pen1);
  1871. // calque_lignes_F_zero->addToGroup(ligne1);
  1872.  
  1873. ligne1 = new QGraphicsLineItem(x0, T_i-1, x0, T_i+1); // T_i : variable GLOBALE
  1874. ligne1->setPen(pen1);
  1875. }
  1876.  
  1877. int m0 = 0;
  1878. m0 = calcul_num_midi(x0);
  1879. enr_i.t = T_i; // T_i : variable GLOBALE
  1880. enr_i.num = num_raie;
  1881. enr_i.midi = m0;
  1882. enr_i.amplitude = y0;
  1883.  
  1884. // tracer sur tableau fréquences
  1885. if(num_raie<10) // 6
  1886. {
  1887. liste_ENR_FFT << enr_i; // memorisation ; donc 5 notes max pour un temps (T_i) donné
  1888. // les notes ayant même T_i seront considérées comme simultanées (accord)
  1889. tracer_1enr(enr_i); // sur le 2eme onglet (NOTES)
  1890. }
  1891.  
  1892. num_raie++;
  1893. }
  1894. }
  1895.  
  1896. //dx /= 1.059463;
  1897.  
  1898. }
  1899. T_i++; // variable GLOBALE
  1900.  
  1901. // T_i est ici incrémenté à chaque appel de la fonction
  1902. // sachant que chaque appel de cette fonction analyse 1024 échantillons du signal.
  1903. // et que chaque échantillon représente une durée = 0.5ms du signal d'origine
  1904. // donc T_i est (virtuellement) incrémenté toutes les 1024*0.5ms = 512ms;
  1905. // pourquoi 'virtuellement' ? parce que chaque échantillon "REPRESENTE" une durée de 0.5 ms
  1906. // mais ne "DURE PAS" 0.5ms; L'analyse s'effectue à très haute vitesse sur un signal pré-échantilloné.
  1907. // de quel chapeau sort ce 0.5ms? Voir la fontion 'void MainWindow::remplir_tableau_echantillons_signal()'
  1908.  
  1909. num_raie=0;
  1910. //affi_notes();
  1911. }
  1912.  
  1913.  
  1914. double MW::calcul_temps(double x)
  1915. {
  1916. // voir 'tracer_echelle_temps_TAB_NOTES()'
  1917.  
  1918. double t; // en secondes
  1919. double x0, dx;
  1920. int offset_x = 80; //80
  1921.  
  1922. x0 = 10.0 * doubleSpinBox_T0->value();
  1923. dx = 1000.0 * pas_echantillonage/256.0;
  1924.  
  1925. t = (x - x0 - offset_x) / (dx * zoom_x);
  1926. return t;
  1927.  
  1928. }
  1929.  
  1930.  
  1931.  
  1932.  
  1933. void MW::tracer_echelle_temps_TAB_NOTES() //en secondes (scene4 sur l'onglet NOTES)
  1934. {
  1935. QString s1;
  1936. double x, x0, dx;
  1937. int offset_x = 80; //80
  1938. int y0 = 620;
  1939. double nbs;
  1940.  
  1941. //effacer_calque(scene4, calque_echelle_temporelle_T);
  1942.  
  1943. if (visu_ech_tps == true) {y0 = 0;} // grandes lignes
  1944. for(int n=0; n<=180; n++)
  1945. {
  1946. x0 = 10.0 * doubleSpinBox_T0->value();
  1947. dx = 1000.0 * pas_echantillonage/256.0; // = 1000 * 24 /256 = 93.75
  1948.  
  1949. x = x0 + dx * zoom_x * (double)n;
  1950.  
  1951. ligne1 = new QGraphicsLineItem(offset_x + x, y0-5, offset_x + x, 650);
  1952. QPen pen1;
  1953. pen1.setColor("#00FF00"); //
  1954. ligne1->setPen(pen1);
  1955. calque_echelle_temporelle_T->addToGroup(ligne1);
  1956.  
  1957. nbs = (double) n; // nombre de secondes
  1958. s1.setNum(nbs, 10, 0); // base 10, 0 décimale
  1959. s1 += "s";
  1960.  
  1961. Etiquette(offset_x + x, 630, 0, s1, "#FFFFFF", "#000000", "#00FF00", calque_echelle_temporelle_T); // en bas
  1962. }
  1963. }
  1964.  
  1965.  
  1966.  
  1967. void MW::tracer_1enr(ENR_FFT enr_i) // c.a.d. ayant la durée élémentaire T_i = 256 ms
  1968. {
  1969. // "notes" primaires -> calque 'calque_TAB_FRQ' sur le 2eme onglet (NOTES)
  1970.  
  1971. int T2;
  1972. //uint8_t num_raie;
  1973. uint8_t m0;
  1974. double yH, yL;
  1975. double y0, y2, dy, dy2;
  1976. uint16_t v; // v comme 'vertical'
  1977. double offset_y = 350.0;
  1978. QString couleur1;
  1979.  
  1980. T2 = zoom_x * enr_i.t;
  1981.  
  1982. m0 = enr_i.midi;
  1983. y0 = enr_i.amplitude;
  1984.  
  1985. if (checkBox_flitrer->isChecked() && (m0 != spinBox_filtre->value())) {return;}
  1986.  
  1987. v= 689 - (12 * (m0-28) );
  1988. y2 = -y0 + offset_y;
  1989. dy = y2/30.0; // 40
  1990. //dy = y2/10;
  1991. //dy=dy*dy; // pour un meilleur affichage ; A VOIR !!!!
  1992. //dy /=5.0;
  1993. dy *= gain;
  1994.  
  1995. if (dy > 200) {dy = 200;} // bridage amplitude max
  1996.  
  1997. if(v > 730) {return;}
  1998.  
  1999. if (dy > seuil)
  2000. {
  2001. dy2 = dy;
  2002. if (checkBox_norm->isChecked()) {dy2=5; } // bride la hauteur des tirets
  2003. double x = 80.0 + T2;
  2004. yH = v+dy2/2;
  2005. yL = v-dy2/2;
  2006. // rabotage pour éviter le scrolling de l'affichage:
  2007. if(yH > 730) {yH = 730;}
  2008. if(yL <0) {yH = 0;}
  2009.  
  2010. //ligne1 = new QGraphicsLineItem(x, yL, x, yH);
  2011.  
  2012. rectangle1 = new QGraphicsRectItem(x, v-dy2/2, zoom_x-2, dy2);
  2013. int h1 = calcul_hauteur_note(m0);
  2014.  
  2015. if (checkBox_norm->isChecked()) // utilise une couleur en fonction de l'amplitude du signal
  2016. {
  2017. double dy3 = dy/ 20;
  2018. if (dy3 > 0.8) {dy3 = 0.8;}
  2019. couleur1 = calcul_couleur(dy3);
  2020. }
  2021. else
  2022. {
  2023. // utilise une couleur en fonction de la fréquence ('hauteur') de la note
  2024. couleur1 = liste_couleurs[h1];
  2025. }
  2026.  
  2027. QPen pen1;
  2028. pen1.setColor(couleur1);
  2029.  
  2030. rectangle1->setPen(pen1);
  2031. rectangle1->setBrush(QColor(couleur1));
  2032.  
  2033. QBrush br1;
  2034. br1.setStyle(Qt::SolidPattern);
  2035. br1.setColor(couleur1);
  2036. rectangle1->setBrush(br1);
  2037. calque_TAB_FRQ->addToGroup(rectangle1); // lent !
  2038.  
  2039. graphicsView1->verticalScrollBar()->setValue(0);
  2040. }
  2041. }
  2042.  
  2043.  
  2044. void MW::detection_notes_auto() // notes secondaires (affi par petits cercles colorés)
  2045. {
  2046. ENR_FFT enr_i;
  2047.  
  2048. int T2;
  2049. uint32_t n_max;
  2050. uint8_t m0;
  2051. double A1;
  2052. double x, y, y0, y2;
  2053. // double memo_x = 0;
  2054. double offset_y = 350.0;
  2055. //double decalage;
  2056. QString couleur1;
  2057. QPen pen1;
  2058. pen1.setWidth(1);
  2059.  
  2060. double pas_grille = doubleSpinBox_dxb->value()/2.0 * zoom_x;
  2061. double offset_x = 10 * doubleSpinBox_x0b->value() + spinBox_d_barres->value() * pas_grille;
  2062.  
  2063. n_max = liste_ENR_FFT.size();
  2064.  
  2065. if (n_max == 0) return;
  2066.  
  2067. tableWidget_type_M->setCurrentCell(2, 0);
  2068. on_tableWidget_type_M_cellClicked(2, 0);
  2069.  
  2070. liste_NOTES.clear();
  2071.  
  2072. for(int n=0; n<84; n++)
  2073. {
  2074. table_integration_amplitudes[n] =0; // RAZ
  2075. }
  2076. calque_notes_auto->setPos(0, 0);
  2077.  
  2078. for(uint32_t n=0; n<n_max-1; n++)
  2079. {
  2080. enr_i = liste_ENR_FFT[n];
  2081. T2 = zoom_x * enr_i.t;
  2082.  
  2083. m0 = enr_i.midi;
  2084.  
  2085. y0 = enr_i.amplitude;
  2086. y2 = -y0 + offset_y;
  2087.  
  2088. // y = 700 - (16 * (m0-40) );
  2089. y = 689 - (12 * (m0-28) );
  2090.  
  2091. A1 = y2/10.0; // 40
  2092. A1 *= gain;
  2093.  
  2094. // table_integration_amplitudes[m0] /= 2.0; // usure volontaire
  2095. if(A1<50)
  2096. {
  2097. table_integration_amplitudes[m0] = 0; // ce qui est débloquant
  2098. }
  2099.  
  2100. if (A1 > 40) // 30
  2101. {
  2102. x = 80.0 + T2 -8; // le -8 pour décaler dans le temps (de la durée de l'intégration)
  2103.  
  2104. //intégration temporelle des amplitudes en vue de valider en tant que note
  2105. if(table_integration_amplitudes[m0] >=0) // si pas de blocage en cours
  2106. {
  2107. table_integration_amplitudes[m0] += A1;
  2108. }
  2109.  
  2110. if (table_integration_amplitudes[m0] > 60.0)
  2111. {
  2112. // la NOTE est comfirmée, on va l'ajouter à la fin de la liste des notes
  2113. // Mais il faut aussi empêcher des re-détections multiples lorsque l'amplitute du signal ne décroit
  2114. // que progressivement. Pour cela on attribue la valeur -1 dans la table d'intégration
  2115. // pour le n° midi de la note, ce qui sera bloquant.
  2116. // Le déblocage se produira lorsque l'amplitude du signal concernant cette note
  2117. // sera descendu en dessous d'un certain niveau.
  2118.  
  2119. table_integration_amplitudes[m0] = -1; //ce qui est bloquant (voir 10 lignes +haut)
  2120.  
  2121. int h1 = calcul_hauteur_note(m0); //'hauteur' au sens musical, gamme chromatique
  2122. couleur1 = liste_couleurs[h1];
  2123. pen1.setColor(couleur1);
  2124.  
  2125. // int delta_x = int(x - memo_x);
  2126. // memo_x = x ;
  2127.  
  2128. ellipse1 = new QGraphicsEllipseItem(x-A1/2, y-A1/2, A1, A1);
  2129. ellipse1->setPen(pen1);
  2130. calque_notes_auto->addToGroup(ellipse1); // grands cercles colorés fin
  2131. //on va ajouter la note à la liste des notes
  2132.  
  2133. int n_barre = calcul_num_barre(x);
  2134.  
  2135. if (n_barre != -1000) {ajout_note(m0, n_barre, 0);}
  2136.  
  2137. // ellipse1 = new QGraphicsEllipseItem(x, v-1, 2, 2);
  2138. // pen1.setColor("#FFFFFF");
  2139. // ellipse1->setPen(pen1);
  2140. // calque_notes_auto->addToGroup(ellipse1); // point blanc
  2141. }
  2142. }
  2143. // voir la fonction -> 'tracer_1enr(ENR_FFT enr_i)' pour le cadrage
  2144.  
  2145. }
  2146. calque_notes_auto->setPos(offset_x, 0);
  2147. mode='M';
  2148. on_Bt_toggle_grille_T_clicked(); // basculera à T;
  2149. doubleSpinBox_vitesse->setValue(30);
  2150. }
  2151.  
  2152.  
  2153. void MW::retracer_TAB_FRQ()
  2154. {
  2155. ENR_FFT enr_i;
  2156. uint16_t n_max = liste_ENR_FFT.length();
  2157. if (n_max == 0) return;
  2158. //effacer_calque(scene1,calque_trace_FFT );
  2159. tracer_graduation_TAB_NOTES();
  2160.  
  2161. calque_TAB_FRQ->setPos(0, 0);
  2162. for(uint16_t n=0; n<n_max-1; n++)
  2163. {
  2164. enr_i = liste_ENR_FFT[n];
  2165. tracer_1enr(enr_i);
  2166. }
  2167.  
  2168. double pas_grille = doubleSpinBox_dxb->value()/2.0 * zoom_x;
  2169. double offset_x = 10 * doubleSpinBox_x0b->value() + spinBox_d_barres->value() * pas_grille;
  2170. calque_TAB_FRQ->setPos(offset_x, 0);
  2171. }
  2172.  
  2173.  
  2174.  
  2175. void RAZ_tableau_echantillons()
  2176. {
  2177. uint n;
  2178. for(n=0; n < nb_ech; n++)
  2179. {
  2180. ech[n].a = 0; // partie reelle
  2181. ech[n].b = 0; // partie imaginaire
  2182. }
  2183. }
  2184.  
  2185.  
  2186.  
  2187. uint bit_reversal(uint num, uint nb_bits)
  2188. {
  2189. uint r = 0, i, s;
  2190. if ( num > (1<< nb_bits)) { return 0; }
  2191.  
  2192. for (i=0; i<nb_bits; i++)
  2193. {
  2194. s = (num & (1 << i));
  2195. if(s) { r |= (1 << ((nb_bits - 1) - i)); }
  2196. }
  2197. return r;
  2198. }
  2199.  
  2200.  
  2201.  
  2202. void MW::bit_reverse_tableau_X()
  2203. {
  2204. // recopie les échantillons en les classant dans l'ordre 'bit reverse'
  2205. uint n,r;
  2206.  
  2207. for(n=0; n < nb_ech; n++) // nb d'échantillons
  2208. {
  2209. r=bit_reversal(n,nb_etapes);
  2210. tab_X[n] = ech[r];
  2211. }
  2212. }
  2213.  
  2214. void MW::calcul_tableau_W()
  2215. {
  2216. if (tableau_w_plein == true) {return;}
  2217. // calcul et mémorisation dans un tableau des twiddle factors (facteurs de rotation dans l'espace vectoriel complexe 'ℂ' )
  2218. uint n;
  2219. double x;
  2220. for(n=0; n<(nb_ech/2-1); n++)
  2221. {
  2222. x=2.0*M_PI * n / nb_ech;
  2223.  
  2224. tab_W[n].a = cos(x); // partie reelle
  2225. tab_W[n].b = -sin(x); // partie imaginaire
  2226. }
  2227. tableau_w_plein = true;
  2228. }
  2229.  
  2230.  
  2231. void MW::calcul_FFT()
  2232. {
  2233. Complexe produit; // voir la classe "Complexe" : complexe.h et complexe.ccp
  2234.  
  2235. uint etape, e1, e2, li, w, ci;
  2236. uint li_max=nb_ech;
  2237. e2=1;
  2238.  
  2239. for (etape=1; etape<=nb_etapes; etape++)
  2240. {
  2241. e1=e2; //(e1 évite d'effectuer des divisions e2/2 plus bas)
  2242. e2=e2+e2; // plus rapide que *=2
  2243.  
  2244. for (li=0; li<li_max; li+=1)
  2245. {
  2246. ci=li & (e2-1); // ET bit à bit
  2247. if (ci>(e1-1))
  2248. {
  2249. w=li_max/e2*(li & (e1 -1)); // ET bit à bit calcul du numéro du facteur de rotation W
  2250. produit = tab_W[w] * tab_X[li]; // le twiddle factor est lu en memoire; le produit est une mutiplication de nb complexes. Voir "complexe.cpp"
  2251. tab_X[li]=tab_X[li-e1] - produit; // concerne la ligne basse du croisillon; soustraction complexe; Voir "complexe.cpp"
  2252. tab_X[li-e1]=tab_X[li-e1] + produit; // concerne la ligne haute du croisillon; addition complexe; Voir "complexe.cpp"
  2253. }
  2254. }
  2255. }
  2256. }
  2257.  
  2258.  
  2259. void MW::Tic1() // pour l'analyse de Fourier en vitesse lente
  2260. {
  2261.  
  2262. nb_tics++;
  2263. if(nb_tics > 4000)
  2264. {
  2265. Timer1->stop();
  2266. nb_tics=0;
  2267. }
  2268. else
  2269. {
  2270. SBX_de->setValue( SBX_de->value() +1); //voir la fonction 'on_SBX_de_valueChanged()'
  2271. Timer1->setInterval(2); // à voir
  2272. }
  2273. }
  2274.  
  2275.  
  2276. void MW::trace_time_line()
  2277. {
  2278. double x_note=0, x, dx;
  2279.  
  2280. if (num_note_jouee < 1) {return;}
  2281. if(mode=='T') { x_note = calcul_x_barre(liste_NOTES[num_note_jouee-1].n_barreT); }
  2282. if(mode=='M') { x_note = calcul_x_barre(liste_NOTES[num_note_jouee-1].n_barreM); }
  2283. dx = calcul_pas_grille();
  2284. x = x_note + double(num_barre_en_cours) * dx;
  2285.  
  2286.  
  2287. int midi_i = liste_NOTES[num_note_jouee-1].midi;
  2288. int y = calcul_y_note(midi_i) ;
  2289.  
  2290. int h1 = calcul_hauteur_note(midi_i);
  2291. QString couleur1 = liste_couleurs[h1];
  2292.  
  2293. QPen pen1;
  2294. pen1.setColor(couleur1);
  2295. pen1.setWidth(2);
  2296.  
  2297. //ellipse1 = new QGraphicsEllipseItem(x, y, 2, 2) ;
  2298. //ellipse1->setPen(pen1);
  2299. //ellipse1->setBrush(blanc);
  2300. //calque_notes_jouee->addToGroup(ellipse1);
  2301.  
  2302. rectangle1 = new QGraphicsRectItem(x, y, dx, 2) ;
  2303. rectangle1->setPen(pen1);
  2304. calque_notes_jouee->addToGroup(rectangle1);
  2305. }
  2306.  
  2307.  
  2308.  
  2309.  
  2310. void MW::Tic2()
  2311. {
  2312. int d_barre;
  2313. float dt, vts;
  2314. int itrv;
  2315.  
  2316. // ---------- pour l'onglet 'NOTES' -----------------------------------------------------------------
  2317. if (Boite_Onglets_Global->currentIndex() == 1)
  2318. {
  2319. vts = doubleSpinBox_vitesse->value();
  2320. if(mode == 'T') {vts *= 2.0;}
  2321. d_barre = joue_1_note_de_la_liste();
  2322. // nb de barres temporelles séparant la note avec celle qui suit
  2323.  
  2324. // qDebug() << "______________";
  2325. // qDebug() << "d_barre" << d_barre;
  2326. // qDebug() << "______________";
  2327.  
  2328. dt = 20.0 * d_barre;
  2329. dt *= (200.0 / vts);
  2330. itrv = (int) dt;
  2331.  
  2332. Timer2->setInterval(itrv); // durée du son de la note
  2333. }
  2334.  
  2335. // ---------- pour l'onglet 'INSTRUMENTS' ------------------------------------------------------------
  2336. if (Boite_Onglets_Global->currentIndex() == 2)
  2337. {
  2338.  
  2339. // à voir : ne lit pas les positions des doigts !!!
  2340.  
  2341. //int i_max = liste_notes.count();
  2342. int i_max=TW_3->rowCount();
  2343. QString s1, s2, s3;
  2344. QString duree_txt;
  2345. int di=0;
  2346.  
  2347. int d_barre;
  2348. float dt, vts;
  2349. int itrv;
  2350.  
  2351. vts = 2.0 * dSBX_vitesse_2->value();
  2352.  
  2353. if ((num_ligne_en_cours >= 0) && (num_ligne_en_cours < i_max) )
  2354. {
  2355. s1 = TW_3->item(num_ligne_en_cours, 8)->text();
  2356. //s2 = s1.mid(1); // partie numérique de "*2"
  2357. duree_txt = TW_3->item(num_ligne_en_cours, 7)->text();
  2358. d_barre = duree_txt.toInt();
  2359. nb_colonnes_a_encadrer = d_barre;
  2360. num_colonne_a_encadrer=Tp1;
  2361.  
  2362. write_Time_line();
  2363. encadrement_colonne();
  2364.  
  2365. // memo_mesure_a_encadrer = mesure_a_encadrer;
  2366. mesure_a_encadrer = s1.toInt(); // numero de la mesure
  2367.  
  2368. TW_3->selectRow(num_ligne_en_cours);
  2369.  
  2370. //diF = duree_txt.toFloat();
  2371. di = duree_txt.toInt();
  2372.  
  2373. s1 = TW_3->item(num_ligne_en_cours, 11)->text();
  2374. s2 = TW_3->item(num_ligne_en_cours, 12)->text();
  2375.  
  2376. notes_silencieuses = true;
  2377. joue_accord_complet(s1, s2); // représentation graphique de la position avant de jouer la note
  2378. notes_silencieuses = false;
  2379.  
  2380. s1 = TW_3->item(num_ligne_en_cours, 8)->text();
  2381. // if (s1 !=" ") {play_toc();}
  2382.  
  2383. effacer_touches();
  2384.  
  2385. joue_1_ligne(num_ligne_en_cours);
  2386.  
  2387. s1 = TW_3->item(num_ligne_en_cours, 13)->text();
  2388. // affi_positions_doigts_dans_status(s1);
  2389.  
  2390. dt = 20.0 * d_barre;
  2391. dt *= (200.0 / vts);
  2392. itrv = (int) dt;
  2393. Timer2->setInterval(itrv);
  2394.  
  2395. }
  2396. num_ligne_en_cours++;
  2397. if (num_ligne_en_cours >= i_max)
  2398. {
  2399. Bt_lecture_2->setText("Jouer tout");
  2400. //Bt_lecture_2->setStyleSheet("QBt{background-color:#50FF1B;}");
  2401. lecture_pause =0;
  2402. QString s1;
  2403. s1.setNum(num_ligne_en_cours);// conversion num -> txt
  2404. Timer2->stop();
  2405. }
  2406.  
  2407.  
  2408. encadrement_ligne();
  2409. Tp1 += di;
  2410.  
  2411. nb_notes_jouees++;
  2412.  
  2413. if (nb_notes_jouees>nb_notes_jouees_max)
  2414. {
  2415. nb_notes_jouees=0;
  2416. lecture_pause =0;
  2417. Timer2->stop();
  2418. }
  2419. }
  2420. }
  2421.  
  2422.  
  2423. void MW::Tic3()
  2424. {
  2425. if(spinBox_6->value()>52)
  2426. {
  2427. Timer3->stop();
  2428. return;
  2429. }
  2430. spinBox_6->setValue( spinBox_6->value() +1);
  2431. Timer3->setInterval(5);
  2432. }
  2433.  
  2434.  
  2435.  
  2436. void clear_temp_data()
  2437. {
  2438. for(int i=0; i<2000000; i++)
  2439. {
  2440. temp_data[i]=0;
  2441. }
  2442. }
  2443.  
  2444.  
  2445. void MW::on_Bt_load_wav_clicked()
  2446. {
  2447.  
  2448. open_fichier_wav(); // associe le binStream1 au fichier wav
  2449. decode_entete();
  2450. MW::setCursor(Qt::WaitCursor);
  2451. liste_ENR_FFT.clear();
  2452. effacer_calque(scene1,calque_trace_signal1 );
  2453. effacer_calque(scene1, calque_trace_FFT);
  2454. clear_temp_data();
  2455. garnis_temp_data(0);
  2456. ajustement_gain();
  2457. // donne accès à la totalité (2MB) du fichier wav (dans le 'temp_data')
  2458. tracer_signal_complet();
  2459. MW::setCursor(Qt::ArrowCursor);
  2460. tracer_gradu_temporelle_signal_entree();
  2461. frame_3->setVisible(true);
  2462. Bt_scan_auto->setVisible(true);
  2463. checkBox_rapide->setVisible(true);
  2464. }
  2465.  
  2466.  
  2467.  
  2468. /*
  2469.   char RIFF[4]; (4 bytes)
  2470.   unsigned long ChunkSize; (4 bytes)
  2471.   char WAVE[4]; (4 bytes)
  2472.   char fmt[4]; (4 bytes)
  2473.   unsigned long Subchunk1Size; (4 bytes)
  2474.   unsigned short AudioFormat; (2 octets)
  2475.   unsigned short NumOfChan; (2 octets)
  2476.   unsigned long SamplesPerSec; (4 bytes)
  2477.   unsigned long bytesPerSec; (4 bytes)
  2478.   unsigned short blockAlign; (2 octets)
  2479.   unsigned short bitsPerSample; (2 octets)
  2480.   char Subchunk2ID[4]; (4 bytes)
  2481.   unsigned long Subchunk2Size; (4 bytes)
  2482.  
  2483.   TOTAL 44 octets
  2484. */
  2485.  
  2486.  
  2487. QString separ_milliers(uint n) // séparation des miliers par des espaces
  2488. {
  2489. QString s1, s1a, s1b, s1c;
  2490. s1.setNum(n);
  2491. int L= s1.length(); s1a = s1.right(3); s1b = s1.mid(L-6, 3); s1c = s1.mid(L-9, 3);
  2492. return (s1c+" "+s1b+" "+s1a);
  2493. }
  2494.  
  2495.  
  2496.  
  2497. void MW::save_fichier_ini()
  2498. {
  2499. QFile file1(QDir::currentPath() + "/" + "params_FFT.ini"); // dans le dossier de l'exécutable
  2500. if (file1.open(QIODevice::WriteOnly | QIODevice::Text))
  2501. {
  2502. //int p1= string_currentFile.lastIndexOf('/');
  2503. //string_currentDir = string_currentFile.left(p1);
  2504.  
  2505. QTextStream out(&file1);
  2506.  
  2507. out << "# Ce fichier est crée automatiquement par le programme";
  2508. out << '\n';
  2509. out << "#";
  2510. out << '\n';
  2511. out << "# chemins:";
  2512. out << '\n';
  2513. out << "<currentDir>" << string_currentDir << "</currentDir>";
  2514. out << '\n';
  2515. out << "<currentFile>" << string_currentFile << "</currentFile>";
  2516. }
  2517. file1.close();
  2518. }
  2519.  
  2520.  
  2521.  
  2522. void MW::open_fichier_wav()
  2523. {
  2524. // Le fichier .wav comprend un signal audio stéréo échantilloné à 48 000 octets/seconde pour chaque canal
  2525. // ce qui fait 96000 octets/s pour l'ensemble du signal stéréo
  2526.  
  2527. string_currentFile = QFileDialog::getOpenFileName(this, tr("Ouvrir Fichier wav..."), string_currentDir,
  2528. tr("Fichiers wav (*.wav);;All Files (*)"));
  2529. if (string_currentFile != "")
  2530. {
  2531. save_fichier_ini();
  2532. }
  2533. else
  2534. {
  2535. wav_ok = false;
  2536. Bt_scan_auto->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(200, 200, 200);");
  2537. return ;
  2538. }
  2539. lineEdit_1->setText(string_currentFile);
  2540.  
  2541. int p1= string_currentFile.lastIndexOf('/');
  2542. string_currentDir = string_currentFile.left(p1);
  2543. lineEdit_current_dir->setText(string_currentDir); // sur l'onglet 'source wav'
  2544. lineEdit_fichier->setText(string_currentDir); // sur l'onglet 'NOTES'
  2545. lineEdit_current_dir_2->setText(string_currentDir); // sur l'onglet 'INSTRUMENTS'
  2546.  
  2547. save_fichier_ini();
  2548.  
  2549. file_wav.setFileName(string_currentFile);
  2550. if (!file_wav.open(QIODevice::ReadOnly))
  2551. {
  2552. wav_ok = false;
  2553. Bt_scan_auto->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(200, 200, 200);");
  2554. return ;
  2555. }
  2556. else
  2557. {
  2558. binStream1.setDevice(&file_wav); // accès à la totalité du fichier wav
  2559. wav_ok = true;
  2560. Bt_scan_auto->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(0, 255, 0);"); // vert
  2561.  
  2562. }
  2563. // le fichier reste ouvert pour toute la session
  2564. }
  2565.  
  2566.  
  2567.  
  2568.  
  2569. void MW::decode_entete()
  2570. {
  2571. // ============ [Bloc de déclaration d'un fichier au format WAVE] ============
  2572.  
  2573. if (! wav_ok) {return;}
  2574. QString s3, s4, s5, fileSize1;
  2575. uint8_t x, nb_canaux;
  2576. double tot1, tot2, tot3, tot4;
  2577.  
  2578.  
  2579. binStream1.device()->seek(0); // retour de la lecture au début du fichier
  2580. binStream1.readRawData (temp_entete, 100); // lecture entete du fichier
  2581. //FileTypeBlocID
  2582. x=(uint8_t)temp_entete[0]; if ((x>64) && (x<127)) { s3 = char(x); }
  2583. x=(uint8_t)temp_entete[1]; if ((x>64) && (x<127)) { s3 += char(x); }
  2584. x=(uint8_t)temp_entete[2]; if ((x>64) && (x<127)) { s3 += char(x); }
  2585. x=(uint8_t)temp_entete[3]; if ((x>64) && (x<127)) { s3 += char(x); }
  2586. TW_entete_wav->setItem(0, 0, new QTableWidgetItem (s3) ); //FileTypeBlocID
  2587.  
  2588. // FileSize
  2589. x=(uint8_t)temp_entete[4]; s3.setNum(x); TW_entete_wav->setItem(1, 0, new QTableWidgetItem (s3) );
  2590. x=(uint8_t)temp_entete[5]; s3.setNum(x); TW_entete_wav->setItem(1, 1, new QTableWidgetItem (s3) );
  2591. x=(uint8_t)temp_entete[6]; s3.setNum(x); TW_entete_wav->setItem(1, 2, new QTableWidgetItem (s3) );
  2592. x=(uint8_t)temp_entete[7]; s3.setNum(x); TW_entete_wav->setItem(1, 3, new QTableWidgetItem (s3) );
  2593.  
  2594. tot1 = temp_entete[4] + (2<<7) * temp_entete[5] + (2<<15) * temp_entete[6] + (2<23)* temp_entete[7];
  2595. fileSize1 = separ_milliers(tot1);
  2596. TW_entete_wav->setItem(1, 4, new QTableWidgetItem ("= " + fileSize1) );
  2597.  
  2598. // FileFormatID
  2599. x=(uint8_t)temp_entete[8]; if ((x>64) && (x<127)) { s3 = char(x); }
  2600. x=(uint8_t)temp_entete[9]; if ((x>64) && (x<127)) { s3 += char(x); }
  2601. x=(uint8_t)temp_entete[10]; if ((x>64) && (x<127)) { s3 += char(x); }
  2602. x=(uint8_t)temp_entete[11]; if ((x>64) && (x<127)) { s3 += char(x); }
  2603. TW_entete_wav->setItem(2, 0, new QTableWidgetItem (s3) );
  2604.  
  2605. // ============ [Bloc décrivant le format audio] ==============
  2606.  
  2607. // FormatBlocID
  2608. x=(uint8_t)temp_entete[12]; if ((x>64) && (x<127)) { s3 = char(x); }
  2609. x=(uint8_t)temp_entete[13]; if ((x>64) && (x<127)) { s3 += char(x); }
  2610. x=(uint8_t)temp_entete[14]; if ((x>64) && (x<127)) { s3 += char(x); }
  2611. x=(uint8_t)temp_entete[15]; if ((x>64) && (x<127)) { s3 += char(x); }
  2612. TW_entete_wav->setItem(3, 0, new QTableWidgetItem (s3) );
  2613.  
  2614. //BlocSize
  2615. x=(uint8_t)temp_entete[16]; s3.setNum(x); TW_entete_wav->setItem(4, 0, new QTableWidgetItem (s3) );
  2616. x=(uint8_t)temp_entete[17]; s3.setNum(x); TW_entete_wav->setItem(4, 1, new QTableWidgetItem (s3) );
  2617. x=(uint8_t)temp_entete[18]; s3.setNum(x); TW_entete_wav->setItem(4, 2, new QTableWidgetItem (s3) );
  2618. x=(uint8_t)temp_entete[19]; s3.setNum(x); TW_entete_wav->setItem(4, 3, new QTableWidgetItem (s3) );
  2619.  
  2620. tot2 = (uint8_t)temp_entete[16] + (2<<7) * (uint8_t)temp_entete[17] + (2<<15) * (uint8_t)temp_entete[18] + (2<23)* (uint8_t)temp_entete[19];
  2621. TW_entete_wav->setItem(4, 4, new QTableWidgetItem ("= " + separ_milliers(tot2)) );
  2622.  
  2623. //AudioFormat
  2624. x=(uint8_t)temp_entete[20]; s3.setNum(x); TW_entete_wav->setItem(5, 0, new QTableWidgetItem (s3) );
  2625. x=(uint8_t)temp_entete[21]; s3.setNum(x); TW_entete_wav->setItem(5, 1, new QTableWidgetItem (s3) );
  2626.  
  2627. if ((uint8_t)temp_entete[20]==1){TW_entete_wav->setItem(5, 4, new QTableWidgetItem ("PCM") );}
  2628.  
  2629. //NbrCanaux
  2630. nb_canaux=(uint8_t)temp_entete[22]; s3.setNum(nb_canaux); TW_entete_wav->setItem(6, 0, new QTableWidgetItem (s3) );
  2631. x=(uint8_t)temp_entete[23]; s3.setNum(x); TW_entete_wav->setItem(6, 1, new QTableWidgetItem (s3) );
  2632.  
  2633. //Fréquence d'échantillonage en Hz
  2634. x=(uint8_t)temp_entete[24]; s3.setNum(x); TW_entete_wav->setItem(7, 0, new QTableWidgetItem (s3) );
  2635. x=(uint8_t)temp_entete[25]; s3.setNum(x); TW_entete_wav->setItem(7, 1, new QTableWidgetItem (s3) );
  2636. x=(uint8_t)temp_entete[26]; s3.setNum(x); TW_entete_wav->setItem(7, 2, new QTableWidgetItem (s3) );
  2637. x=(uint8_t)temp_entete[27]; s3.setNum(x); TW_entete_wav->setItem(7, 3, new QTableWidgetItem (s3) );
  2638.  
  2639. tot3 = (uint8_t)temp_entete[24] + (2<<7) * (uint8_t)temp_entete[25] + (2<<15) * (uint8_t)temp_entete[26] + (2<23)* (uint8_t)temp_entete[27];
  2640. TW_entete_wav->setItem(7, 4, new QTableWidgetItem ("= " + separ_milliers(tot3)) );
  2641.  
  2642. //BytePerSec
  2643. x=temp_entete[28]; s3.setNum(x); TW_entete_wav->setItem(8, 0, new QTableWidgetItem (s3) );
  2644. x=temp_entete[29]; s3.setNum(x); TW_entete_wav->setItem(8, 1, new QTableWidgetItem (s3) );
  2645. x=temp_entete[30]; s3.setNum(x); TW_entete_wav->setItem(8, 2, new QTableWidgetItem (s3) );
  2646. x=temp_entete[31]; s3.setNum(x); TW_entete_wav->setItem(8, 3, new QTableWidgetItem (s3) );
  2647.  
  2648. tot4 = (uint8_t)temp_entete[28] + (2<<7) * (uint8_t)temp_entete[29] + (2<<15) * (uint8_t)temp_entete[30] + (2<23)* (uint8_t)temp_entete[31];
  2649. s3.setNum(tot4); // 96000
  2650.  
  2651. TW_entete_wav->setItem(8, 4, new QTableWidgetItem (s3));
  2652. //tableWidget_1->setItem(8, 4, new QTableWidgetItem ("= " + separ_milliers(tot4)) );
  2653.  
  2654. //BytePerBloc
  2655. x=(uint8_t)temp_entete[32]; s3.setNum(x); TW_entete_wav->setItem(9, 0, new QTableWidgetItem (s3) );
  2656. x=(uint8_t)temp_entete[33]; s3.setNum(x); TW_entete_wav->setItem(9, 1, new QTableWidgetItem (s3) );
  2657.  
  2658. //BitsPerSample
  2659. x=(uint8_t)temp_entete[34]; s3.setNum(x); TW_entete_wav->setItem(10, 0, new QTableWidgetItem (s3) );
  2660. x=(uint8_t)temp_entete[35]; s3.setNum(x); TW_entete_wav->setItem(10, 1, new QTableWidgetItem (s3) );
  2661.  
  2662. x=(uint8_t)temp_entete[36]; if ((x>64) && (x<127)) { s3 = char(x); }
  2663. x=(uint8_t)temp_entete[37]; if ((x>64) && (x<127)) { s3 += char(x); }
  2664. x=(uint8_t)temp_entete[38]; if ((x>64) && (x<127)) { s3 += char(x); }
  2665. x=(uint8_t)temp_entete[39]; if ((x>64) && (x<127)) { s3 += char(x); }
  2666. TW_entete_wav->setItem(11, 0, new QTableWidgetItem (s3) );
  2667.  
  2668. // DataSize
  2669. x=(uint8_t)temp_entete[40]; s3.setNum(x); TW_entete_wav->setItem(12, 0, new QTableWidgetItem (s3) );
  2670. x=(uint8_t)temp_entete[41]; s3.setNum(x); TW_entete_wav->setItem(12, 1, new QTableWidgetItem (s3) );
  2671. x=(uint8_t)temp_entete[42]; s3.setNum(x); TW_entete_wav->setItem(12, 2, new QTableWidgetItem (s3) );
  2672. x=(uint8_t)temp_entete[43]; s3.setNum(x); TW_entete_wav->setItem(12, 3, new QTableWidgetItem (s3) );
  2673.  
  2674. int tot5a = 1 * (uint8_t) temp_entete[40]; //because le temp_entête de type 'char' code avec entiers signés
  2675. int tot5b = (1<<8) * (uint8_t)temp_entete[41]; // remarque: (1<<8) = 2^8 = 256 // ne pas écrire (2<<8) !!
  2676. int tot5c = (1<<16) * (uint8_t)temp_entete[42];
  2677. int tot5d = (1<<24) * (uint8_t)temp_entete[43];
  2678.  
  2679. data_size = tot5a + tot5b + tot5c + tot5d;
  2680.  
  2681. // 21248 + 458752 = 480000
  2682. // pour le .wav LA 440 (48000, durée 10s) ->14x(2^16) + 166 * (2^8) = 960000
  2683. // 960 000 kb (stéréo) / 96 000 kb/s (stéréo)= 10s
  2684.  
  2685. TW_entete_wav->setItem(12, 4, new QTableWidgetItem ("= " + separ_milliers(data_size)) ); // DataSize
  2686.  
  2687. // durée calculée
  2688. duree_totale = data_size / tot4;
  2689. s3.setNum(duree_totale, 'f', 3);// double n, char format = 'g', int precision = 6
  2690. TW_entete_wav->setItem(13, 4, new QTableWidgetItem (s3 + " s") );
  2691.  
  2692. s4.setNum(tot4);
  2693. s4 = "ech : " + s3;
  2694. s4 += " Bps / 2 voies (stéréo) = ";
  2695.  
  2696. s5.setNum(tot4/2000);
  2697. s5 +=" kBps";
  2698.  
  2699. TW_entete_wav->setItem(8, 5, new QTableWidgetItem (s5) );
  2700. lineEdit_6->setText("File size = " + fileSize1 + " bytes ; " + s4 + s5 + " ; durée calculée = " +s3 + "s");
  2701.  
  2702. if ((nb_canaux == 2) && (tot4 != 96000))
  2703. {
  2704. QMessageBox msgBox;
  2705. QString s1;
  2706. s1 = "Attention: Le taux d'échentillonage n'est pas 48 kb/s";
  2707. msgBox.setText(s1);
  2708. msgBox.exec();
  2709. }
  2710. if (nb_canaux != 2)
  2711. {
  2712. QMessageBox msgBox;
  2713. QString s1;
  2714. s1 = "Attention: Signal mono (doit être STEREO !)";
  2715. msgBox.setText(s1);
  2716. msgBox.exec();
  2717. }
  2718. }
  2719.  
  2720.  
  2721.  
  2722.  
  2723.  
  2724. // voir la page : https://fr.wikipedia.org/wiki/Waveform_Audio_File_Format
  2725. void MW::garnis_temp_data(qint32 offset_i)
  2726. {
  2727. if (! wav_ok) {return;}
  2728.  
  2729. binStream1.device()->seek(0); // retour de la lecture au début du fichier
  2730. binStream1.skipRawData(44+offset_i); // saut bien plus loin dans le fichier
  2731. binStream1.readRawData (temp_data, 2000000); //lecture des données audio
  2732.  
  2733. //file_wav.close();
  2734. }
  2735.  
  2736.  
  2737. void MW::calcul_compression()
  2738. {
  2739. double R;
  2740. double R_max=0;
  2741.  
  2742. for(uint n =0; n<nb_ech/4; n++)
  2743. {
  2744. R=ech[n].a;
  2745. if (R>R_max) {R_max=R;}
  2746. }
  2747. }
  2748.  
  2749.  
  2750. void MW::remplir_tableau_echantillons_signal() // lecture du signal à analyser dans le 'temp_data' -> ech[n]
  2751. {
  2752.  
  2753. /*
  2754. Le fichier .wav doit avoir les caractéristiques suivantes :
  2755. - RIFF PCM WAVE fmt
  2756. - stéréo deux voies
  2757. - 96000 octets/s c'est à dire acqui avec 48000 octets/s x 2 voies
  2758. La FTT sera effectuée en 10 passes, sur un nb_ech = 2^10 = 1024 échantillons
  2759. */
  2760.  
  2761. uint n, n_max, i, offset_x;
  2762. double R;
  2763.  
  2764. offset_x = 40; // ou plus, si lecture plus loin dans le temps, à voir
  2765.  
  2766. uint8_t octet_n; // octet_B;
  2767. /*
  2768.   pour un codage 8 bits/sample = 2 * 1 octet/sample (stéréo)
  2769.   [Octet du Sample1 Canal1 ] (octet_A, octet_B)
  2770.   [Octet du Sample1 Canal2 ]
  2771.   ...
  2772. */
  2773. i=0;
  2774. n=0;
  2775. // on ne prend pas en compte tous les échantillons dispo dans le .wav (inutile ici)
  2776. // mais 1 sur 40 (la fréquence de la note la plus aigue (midi94) est = 932Hz)
  2777. // et seul le fondamental est pertinent pour reconnaitre la note, les harmoniques (timbre) sont ignorées
  2778. // il faut donc échantilloner à 932*2 = 1864 Hz au minimum
  2779. // Le fichier .wav d'origine est échantilloné à 48kHz
  2780. // 48000 / 1864 = 25.75
  2781. // On va prendre 1 échantillon sur 24 , ce qui donne un échantillonage à 48000/24 = 2000Hz
  2782. // attention : tout changement de cette valeur (pas = 24) change l'échelle de représentation de la FFT
  2783. // et fout le bocson dans tout le programme !!!
  2784. // chaque échantillon représente donc une durée = 1/2000 seconde = 0.5ms = 500us
  2785. // voir la suite des explications vers la fin de la fonction 'void MainWindow::tracer_segments_FFT()'
  2786.  
  2787. n_max = nb_ech /2; // = 1024/2 = 512
  2788. // 512*0.5ms = 256 ms
  2789.  
  2790. while (n < n_max)
  2791. {
  2792. octet_n = temp_data[offset_x + i]; // canal A
  2793. // i++; // pour sauter (et ignorer) le canal B (le signal dans le fichier .wav est stéréo)
  2794. i+= pas_echantillonage;
  2795.  
  2796. // x= 256 * octet_A + octet_B;
  2797. R = octet_n - 128; // pour oter la composante continue propre au codage par des octets non signés
  2798. R /= 10.0;
  2799. R *= doubleSpinBox_gain->value();
  2800.  
  2801. if (hamming) { R = R * (1- cos (2* M_PI * n / nb_ech/2 ));}
  2802.  
  2803. if (bourrage_de_zeros)
  2804. {
  2805. if (n<=nb_ech/4) // /4 -> signal
  2806. {
  2807. ech[n].a = R; // partie reelle
  2808. ech[n].b = 0; // partie imaginaire
  2809. }
  2810. else // -> Bourage de zéros
  2811. {
  2812. ech[n].a = 0; // partie reelle
  2813. ech[n].b = 0; // partie imaginaire
  2814. }
  2815. }
  2816. else
  2817. {
  2818. ech[n].a = R; // partie reelle
  2819. ech[n].b = 0; // partie imaginaire
  2820. }
  2821.  
  2822. n++; // n atteindra la valeur max = 512 ech représentant une durée totale de 256 ms
  2823. }
  2824.  
  2825. //calcul_compression();
  2826. }
  2827.  
  2828. /*
  2829. void MW::on_toolButton_2_clicked() // recup signal
  2830. {
  2831.   RAZ_tableau_echantillons();
  2832.   remplir_tableau_echantillons_signal();
  2833.   tracer_signal_a_convertir();
  2834. }
  2835. */
  2836.  
  2837. void MW::calcul_ofsset()
  2838. {
  2839. if(!wav_ok) return;
  2840. offset_t = spinBox_1->value() + 10 * SBX_tonique->value() + 100 * spinBox_3->value() + 1000 * spinBox_4->value()
  2841. + 10000 * spinBox_5->value() + 100000 * spinBox_6->value();
  2842. QString s1;
  2843. s1 = separ_milliers(offset_t) ;
  2844. lineEdit_3->setText(s1);
  2845. effacer_calque(scene2, calque_encadrement2);
  2846. encadrement_signal(offset_t/1200, 25);
  2847. }
  2848.  
  2849.  
  2850. void MW::traitement_signal() // lance les Transformées de Fourier d'un cluster de signal
  2851. {
  2852. if (! wav_ok) {return;}
  2853.  
  2854. garnis_temp_data(offset_t);
  2855. remplir_tableau_echantillons_signal();
  2856.  
  2857. calcul_tableau_W();
  2858. //RAZ_tableau_echantillons();
  2859.  
  2860. if(!rapide) { tracer_signal_a_convertir();}
  2861. bit_reverse_tableau_X();
  2862.  
  2863. calcul_FFT();
  2864. // 1 FFT s'effectue sur 1 cluster de 1024 échantillons.
  2865. // chaque échantillon représente une durée = 1/2000 seconde = 0.5ms = 500us
  2866. // Le résultat représente un spectre élémentaire correspondant au cluster, c.a.d à une durée = 1024 x 0.5ms = 512 ms
  2867. // ce résultat est retourné dans le tableau 'Complexe tab_X[2048]'
  2868.  
  2869. // La fréquence minimale pouvant être résolue est 1/512ms = 1.953Hz (~2Hz). Toutefois la précision décroit à l'approche
  2870. // de cette limite.
  2871. // La détection des notes consiste à détecter les maximums de la fonction, il faut donc prendre une marge d'erreur
  2872. // On va donc limiter l'analyse à la fréquence du MI garve de la guitare : F_min=82Hz. (midi = 40)
  2873. // Dans le deuxième onglet du programme (NOTES) il est toutefois possible de saisir des notes une octave en dessous (41Hz)
  2874. // Ce qui permet de saisir manuellement la plupart des partitions pour piano.
  2875. // ToDo: rajouter des touches au clavier de l'onglet 'INSTRUMENTS'... (et des cordes à la guitare ? ah non !)
  2876.  
  2877. if(checkBox_Primaire->isChecked())
  2878. {
  2879. tracer_1_ligneV_primaire_FFT();
  2880. }
  2881. else
  2882. {
  2883. tracer_segments_FFT();
  2884. }
  2885.  
  2886. }
  2887.  
  2888.  
  2889. void MW::tracer_echelle_V_3()
  2890. {
  2891. double y;
  2892. for(int n=0; n<=42; n++)
  2893. {
  2894. y = 35 + 20.2 * n;
  2895. QPen pen1("#222222");
  2896. pen1.setWidth(1);
  2897. painter1.setPen(pen1);
  2898. painter1.drawLine(0, y, 1900, y);
  2899. label_image_FFT->setPixmap(QPixmap::fromImage(image1));
  2900. }
  2901.  
  2902.  
  2903. }
  2904.  
  2905.  
  2906.  
  2907. void MW::analyse_tout() // FFT de tous les clusters, c.a.d. sur la totalité du signal
  2908. {
  2909. progressBar_1->setVisible(true);
  2910.  
  2911. QString s1;
  2912.  
  2913. offset_t=0;
  2914.  
  2915. if (Boite_Onglets_Global->currentIndex() == 3)
  2916. {
  2917. offset_t = (SB_offset_T->value() * 2000) * 1024;
  2918. }
  2919.  
  2920.  
  2921. T_i=0; // variable GLOBALE
  2922.  
  2923. uint16_t i_max = data_size / 1024; // = environ 6000
  2924. if (checkBox_debut_seul->isChecked()) {i_max=2000;} // pour gagner du temps lors de la phase de test
  2925.  
  2926.  
  2927. // data_size est affiché par le visualisateur d'entête
  2928. // et aussi dans le LineEdit en bas de l'onglet FFT
  2929. // data_size = de l'ordre de 7MB, ce qui nous donne un i_max d'environ 6900
  2930.  
  2931. //effacer_calque(scene4, calque_TAB_FRQ);
  2932. liste_ENR_FFT.clear();
  2933. //clear_temp_data();
  2934. //garnis_temp_data(0);
  2935.  
  2936. // effacer_calque(scene4, calque_gradu_TAB_FRQ);
  2937. // effacer_calque(scene4, calque_notes_manuelles);
  2938. // effacer_calque(scene4, calque_notes_jouee);
  2939. // effacer_calque(scene4, calque_grille_mesures);
  2940. // effacer_calque(scene4, calque_echelle_temporelle_T);
  2941.  
  2942. for(uint16_t i=0 ; i<i_max ; i++) // cette boucle sera donc parcourue environ 6000 fois...
  2943. {
  2944. if ((i % 200) == 0)
  2945. {
  2946. uint16_t pc = 100 * i / i_max;
  2947. pc+=2;
  2948. progressBar_1->setValue(pc);
  2949. // la ligne suivante permet l'affichage de la progression
  2950. QCoreApplication::processEvents(QEventLoop::AllEvents, 1);
  2951. }
  2952. //s1.setNum(i); lineEdit_compteur->setText(s1);
  2953.  
  2954. traitement_signal(); // traitement d'un cluster de 1024 échantillons
  2955.  
  2956. if (Boite_Onglets_Global->currentIndex() == 3) { offset_t += (SB_delta_T->value() * 1024); }
  2957. else { offset_t += 1024; }// on passera au cluster de 1024 échantillons suivant c.a.d à un temps + 0.5ms }
  2958. }
  2959. progressBar_1->setVisible(false);
  2960. if (Boite_Onglets_Global->currentIndex() == 3) { tracer_echelle_V_3(); } else { tracer_echelle_temps_TAB_NOTES(); }
  2961. }
  2962.  
  2963.  
  2964.  
  2965. void MW::on_spinBox_1_valueChanged(int arg1)
  2966. {
  2967. effacer_calque(scene1,calque_lignes_F_zero );
  2968. if (arg1==10) { spinBox_1->setValue(0); SBX_tonique->stepUp();}
  2969. calcul_ofsset();
  2970. traitement_signal();
  2971. }
  2972.  
  2973.  
  2974. void MW::on_spinBox_2_valueChanged(int arg1)
  2975. {
  2976. effacer_calque(scene1,calque_lignes_F_zero );
  2977. if (arg1==-1) {spinBox_2->setValue(9); spinBox_3->stepDown();}
  2978. if (arg1==10) { spinBox_2->setValue(0); spinBox_3->stepUp();}
  2979. calcul_ofsset();
  2980. traitement_signal();
  2981. }
  2982.  
  2983.  
  2984. void MW::on_spinBox_3_valueChanged(int arg1)
  2985. {
  2986. effacer_calque(scene1,calque_lignes_F_zero );
  2987. if (arg1==-1) {spinBox_3->setValue(9); spinBox_4->stepDown();}
  2988. if (arg1==10) { spinBox_3->setValue(0); spinBox_4->stepUp();}
  2989. calcul_ofsset();
  2990. traitement_signal();
  2991. }
  2992.  
  2993.  
  2994. void MW::on_spinBox_4_valueChanged(int arg1)
  2995. {
  2996. effacer_calque(scene1,calque_lignes_F_zero );
  2997. if (arg1==-1) {spinBox_4->setValue(9); spinBox_5->stepDown();}
  2998. if (arg1==10) { spinBox_4->setValue(0); spinBox_5->stepUp();}
  2999. calcul_ofsset();
  3000. traitement_signal();
  3001. }
  3002.  
  3003.  
  3004. void MW::on_spinBox_5_valueChanged(int arg1)
  3005. {
  3006. effacer_calque(scene1,calque_lignes_F_zero );
  3007. if (arg1==-1) {spinBox_5->setValue(9); spinBox_6->stepDown();}
  3008. if (arg1==10) { spinBox_5->setValue(0); spinBox_6->stepUp();}
  3009. calcul_ofsset();
  3010. traitement_signal();
  3011. }
  3012.  
  3013.  
  3014. void MW::on_spinBox_6_valueChanged()
  3015. {
  3016. //if (arg1==-1) {spinBox_6->setValue(9);} //spinBox_6->stepDown();}
  3017. effacer_calque(scene1,calque_lignes_F_zero );
  3018. calcul_ofsset();
  3019. traitement_signal();
  3020. }
  3021.  
  3022.  
  3023. void MW::on_doubleSpinBox_1_valueChanged()
  3024. {
  3025. effacer_calque(scene1,calque_lignes_F_zero );
  3026. calcul_ofsset();
  3027. traitement_signal();
  3028. }
  3029.  
  3030.  
  3031. void MW::on_Bt_8_clicked()
  3032. {
  3033. QMessageBox msgBox;
  3034. QString s1;
  3035. s1 = "Le fichier audio à analyser doit être au format unsigned 8 bits PCM";
  3036. s1 += " (généré par exemple avec Audacity)";
  3037. s1 += "\n";
  3038. s1 += "Attention: ce n'est pas le format PCM par défaut, il faut aller dans les sous-menus :";
  3039. s1 += "\n";
  3040. s1 += "Fichier/Exporter/Exporter en WAV / encodage : Unsigned 8-bit PCM";
  3041. s1 += "\n";
  3042. s1 += "Ce n'est pas 'top WiFi', mais largement suffisant pour en faire la FFT et retrouver les notes.";
  3043. s1 += "\n";
  3044. s1 += "Ce qui est le but ici.";
  3045. s1 += "\n";
  3046. s1 += "D'autre part il est vivement conseillé de compresser la dynamique de l'audio (ce qui est simple avec Audacity)";
  3047. s1 += "\n";
  3048. s1 += "ce qui facilite grandement la détection des notes.";
  3049.  
  3050. msgBox.setText(s1);
  3051. msgBox.exec();
  3052. }
  3053.  
  3054.  
  3055. void MW::on_Bt_RAZ_clicked() // du sélecteur temporel sur l'onglet 'Source wav'
  3056. {
  3057. spinBox_1->setValue(0);
  3058. spinBox_2->setValue(0);
  3059. spinBox_3->setValue(0);
  3060. spinBox_4->setValue(0);
  3061. spinBox_5->setValue(20);
  3062. spinBox_6->setValue(0);
  3063. offset_t=0;
  3064. num_barre_en_cours=0;
  3065.  
  3066. effacer_calque(scene1,calque_trace_FFT );
  3067. effacer_calque(scene1,calque_lignes_F_zero );
  3068. }
  3069.  
  3070.  
  3071.  
  3072. void MW::on_spinBox_7_valueChanged(int arg1)
  3073. {
  3074. // ligne verticale
  3075. effacer_calque(scene1,calque_curseur);
  3076. int x = arg1;
  3077. ligne1 = new QGraphicsLineItem(x, 10, x, 500);
  3078. ligne1->setPen(pen_curseur);
  3079. calque_curseur->addToGroup(ligne1);
  3080.  
  3081. }
  3082.  
  3083.  
  3084.  
  3085. void MW::on_Bt_2_clicked()
  3086. {
  3087. Timer1->stop();
  3088. nb_tics=0;
  3089. }
  3090.  
  3091.  
  3092. void MW::on_Btn_52_clicked()
  3093. {
  3094. //spinBox_n_midi->setValue(52);
  3095.  
  3096. file_wav.setFileName(nom_fichier_in);
  3097. if (!file_wav.open(QIODevice::ReadOnly))
  3098. {
  3099. wav_ok = false;
  3100. return ;
  3101. }
  3102.  
  3103. wav_ok = true;
  3104.  
  3105. on_Bt_RAZ_clicked();
  3106.  
  3107. binStream1.setDevice(&file_wav);
  3108. calcul_ofsset();
  3109. traitement_signal();
  3110. }
  3111.  
  3112.  
  3113. void MW::on_Btn_94_clicked()
  3114. {
  3115.  
  3116. file_wav.setFileName(nom_fichier_in);
  3117. if (!file_wav.open(QIODevice::ReadOnly))
  3118. {
  3119. wav_ok = false;
  3120. return ;
  3121. }
  3122.  
  3123. wav_ok = true;
  3124.  
  3125. on_Bt_RAZ_clicked();
  3126.  
  3127. binStream1.setDevice(&file_wav);
  3128. calcul_ofsset();
  3129. traitement_signal();
  3130. }
  3131.  
  3132.  
  3133. void MW::on_Bt_efface_clicked()
  3134. {
  3135. QMessageBox msgBox;
  3136. msgBox.setText("Erase Frequences");
  3137. msgBox.setInformativeText("Effacer toutes les FFT ?");
  3138. msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  3139. msgBox.setDefaultButton(QMessageBox::Cancel);
  3140. int ret = msgBox.exec();
  3141.  
  3142. if (ret == QMessageBox::Ok )
  3143. {
  3144. effacer_calque(scene1,calque_trace_signal1 );
  3145. effacer_calque(scene1,calque_trace_FFT );
  3146. effacer_calque(scene1,calque_lignes_F_zero );
  3147. effacer_calque(scene1,calque_encadrement1 );
  3148. effacer_calque(scene2,calque_encadrement2 );
  3149.  
  3150. effacer_calque(scene4,calque_TAB_FRQ );
  3151. on_Bt_RAZ_clicked();
  3152. T_i=0; // T_i : variable GLOBALE
  3153. }
  3154.  
  3155. }
  3156.  
  3157.  
  3158.  
  3159. void MW::on_Bt_3_clicked()
  3160. {
  3161.  
  3162. TW_entete_wav->setVisible(true);
  3163. Bt_close_entete->setVisible(true);
  3164. }
  3165.  
  3166.  
  3167. void MW::on_Bt_close_entete_clicked()
  3168. {
  3169. TW_entete_wav->setVisible(false);
  3170. Bt_close_entete->setVisible(false);
  3171. }
  3172.  
  3173. /*
  3174. void MW::on_Bt_close_frame1_clicked()
  3175. {
  3176.   frame_1->setVisible(false);
  3177.   frame_3->setVisible(true);
  3178. }
  3179.  
  3180.  
  3181. void MW::on_Bt_composition_clicked()
  3182. {
  3183.   frame_3->setVisible(false);
  3184.   frame_1->setVisible(true);
  3185. }
  3186. */
  3187.  
  3188.  
  3189. void MW::on_Bt_6_clicked()
  3190. {
  3191. frame_notes->setVisible(false);
  3192. }
  3193.  
  3194.  
  3195.  
  3196.  
  3197. int MW::save_fichier_FRQ(QString date_i)
  3198. {
  3199. // enregisterment incrémentiel sur le disque (nom de fichier = 1..2...3...)
  3200. ENR_FFT enr_i;
  3201. QString s1;
  3202.  
  3203. uint8_t x0a = spinBox_x0a->value();
  3204. double x0b = doubleSpinBox_x0b->value();
  3205.  
  3206. //uint8_t dxa = spinBox_dxa->value();
  3207. double dxb = doubleSpinBox_dxb->value();
  3208.  
  3209. long n_max = liste_ENR_FFT.length();
  3210. if (n_max == 0)
  3211. {
  3212. QMessageBox msgBox; msgBox.setText("liste FRQ vide !"); msgBox.exec();
  3213. return 1;
  3214. }
  3215. //int numero=0;
  3216. QString s2 = date_i;
  3217. Timer1->stop();
  3218.  
  3219. QFile file1(string_currentDir + "/" + s2 + ".FRQ");
  3220. if (file1.open(QIODevice::WriteOnly | QIODevice::Text))
  3221. {
  3222. QByteArray byteArray1;
  3223. QDataStream stream1(&byteArray1, QIODevice::WriteOnly);
  3224. stream1.setDevice(&file1);
  3225. stream1.setVersion(QDataStream::Qt_6_8);
  3226.  
  3227. // entête 64 octets------------------
  3228. double vts = doubleSpinBox_vitesse->value(); // 8 octets
  3229. stream1 << x0b << dxb << vts << Ta << Tb << x0a; //8+8+8+1+1+1+1 =27 octets au début du fichier
  3230.  
  3231. for (int i=0; i<(64-27); i++) {stream1 << 'x';} // complète à 64 octet
  3232. // ----------------------------------
  3233.  
  3234. for(int n=0; n<n_max; n++)
  3235. {
  3236. enr_i = liste_ENR_FFT[n];
  3237. stream1 << enr_i.amplitude << enr_i.midi << enr_i.num << enr_i.t; // sérialisation des data
  3238. }
  3239. }
  3240. file1.close();
  3241.  
  3242. return 0;
  3243.  
  3244. }
  3245.  
  3246.  
  3247. void MW::choix_dossier_de_travail()
  3248. {
  3249.  
  3250. QString actuel = string_currentDir;
  3251.  
  3252. if (string_currentDir == "") { string_currentDir = QDir::homePath(); }
  3253.  
  3254. string_currentDir = QFileDialog::getExistingDirectory
  3255. (this, tr("Open Directory"), actuel, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
  3256.  
  3257. if (string_currentDir != "")
  3258. {
  3259. dossier_de_travail_ok = true;
  3260. save_fichier_ini();
  3261. lineEdit_current_dir->setText(string_currentDir); // sur l'onglet 'source wav'
  3262. lineEdit_fichier->setText(string_currentDir); // sur l'onglet 'NOTES'
  3263. lineEdit_current_dir_2->setText(string_currentDir); // sur l'onglet 'INSTRUMENTS'
  3264.  
  3265. }
  3266. else // -> si on clique sur le bouton 'cancel'
  3267. {
  3268. string_currentDir = QDir::homePath();
  3269. //dossier_de_travail_ok = false;
  3270. }
  3271.  
  3272. }
  3273.  
  3274.  
  3275. void MW::on_Bt_choix_current_dir_clicked()
  3276. {
  3277. lecture_en_cours = false;
  3278. Timer2->stop();
  3279. Bt_jouer_tout->setText(">");
  3280. choix_dossier_de_travail();
  3281. }
  3282.  
  3283.  
  3284. void MW::on_Bt_choix_current_dir_2_clicked()
  3285. {
  3286. lecture_en_cours = false;
  3287. Timer2->stop();
  3288. Bt_jouer_tout->setText(">");
  3289. choix_dossier_de_travail();
  3290. }
  3291.  
  3292.  
  3293. void MW::on_Bt_choix_current_dir_3_clicked()
  3294. {
  3295. lecture_en_cours = false;
  3296. Timer2->stop();
  3297. Bt_jouer_tout->setText(">");
  3298. choix_dossier_de_travail();
  3299. }
  3300.  
  3301.  
  3302. void MW::ajustement_gain()
  3303. {
  3304. double somme;
  3305. double moyenne=0;
  3306. double R;
  3307. double gain=0.3;
  3308. uint8_t octet_n;
  3309. long i, j;
  3310. double pas = 10.0 * pas_echantillonage; // 240
  3311. double n_max=1;
  3312. if (pas !=0)
  3313. {
  3314. n_max = 2000000 / pas;
  3315. }
  3316. i=0;
  3317. j=0;
  3318. somme =0;
  3319. for(long n=0; n<n_max; n++)
  3320. {
  3321.  
  3322. octet_n = temp_data[i]; // canal 1
  3323. if (octet_n !=0)
  3324. {
  3325. R = octet_n - 128;// pour ôter la composante continue (octets non signés)
  3326. if (R<0) {R= -R;}
  3327. somme += R;
  3328. j++; // nb de notes effectivement prises en compte
  3329. }
  3330. i+= pas;
  3331. }
  3332. if (j !=0) { moyenne = somme / j;}
  3333. if (moyenne !=0) { gain = 20.0/moyenne;}
  3334. doubleSpinBox_gain->setValue(gain);
  3335. }
  3336.  
  3337.  
  3338. void MW::load_fichier_FRQ()
  3339. {
  3340. QString filename1;
  3341. QString s1;
  3342.  
  3343. MW::setCursor(Qt::WaitCursor);
  3344.  
  3345. if(dossier_de_travail_ok == false)
  3346. {
  3347. choix_dossier_de_travail();
  3348. if (dossier_de_travail_ok == false)
  3349. {
  3350. QMessageBox msgBox;
  3351. s1="Le dossier de travail n'est pas spécifié";
  3352. msgBox.setText(s1); msgBox.exec();
  3353. MW::setCursor(Qt::ArrowCursor);
  3354. return ;
  3355. }
  3356. }
  3357.  
  3358. filename1 = QFileDialog::getOpenFileName(this,
  3359. tr("Ouvrir Fichier FRQ"), string_currentDir + "/", tr("Fichiers FRQ (*.FRQ)"));
  3360.  
  3361.  
  3362. lineEdit_fichier_FREQ->setText(filename1);
  3363.  
  3364. file_dat.setFileName(filename1);
  3365. if (!file_dat.open(QIODevice::ReadOnly))
  3366. {
  3367. data_nts_ok = false;
  3368. MW::setCursor(Qt::ArrowCursor);
  3369. return ;
  3370. }
  3371. else
  3372. {
  3373. binStream1.setDevice(&file_dat); // accès à la totalité du fichier dat
  3374. binStream1.setVersion(QDataStream::Qt_6_8);
  3375. data_nts_ok = true;
  3376. liste_ENR_FFT.clear();
  3377. }
  3378.  
  3379. //int z = sizeof(ENR_FFT); // ATTENTION ! ne PAS utiliser cette valeur qui tient en compte l'alignement en RAM
  3380. long n_max = file_dat.bytesAvailable() / 14; // 14 bits par enr; voir la def de 'ENR_FFT' dans le .h
  3381.  
  3382. uint8_t x0a;
  3383. double x0b;
  3384. uint8_t dxa;
  3385. double dxb;
  3386.  
  3387. double vts;
  3388.  
  3389. // lecture entête -----------------
  3390.  
  3391. binStream1 >> x0b >> dxb >> vts >> Ta >> Tb >> x0a >> dxa; // 8+8+8+1+1+1+1=28 octets au début du fichiers
  3392.  
  3393. uint8_t xx;
  3394. for (int i=0; i<(64-28); i++) {binStream1 >> xx;} // lit en tout à 64 octets
  3395. //---------------------------------
  3396.  
  3397. spinBox_x0a->setValue(x0a);
  3398. doubleSpinBox_x0b->setValue(x0b);
  3399. // spinBox_dxa->setValue(dxa);
  3400. doubleSpinBox_dxb->setValue(dxb);
  3401. doubleSpinBox_vitesse->setValue(vts);
  3402.  
  3403. //---------------------------------
  3404.  
  3405. ENR_FFT enr_i;
  3406. for(int n=0; n<n_max; n++)
  3407. {
  3408. binStream1 >> enr_i.amplitude >> enr_i.midi >> enr_i.num >> enr_i.t;
  3409. liste_ENR_FFT << enr_i;
  3410. }
  3411. file_dat.close();
  3412.  
  3413. retracer_TAB_FRQ();
  3414. MW::setCursor(Qt::ArrowCursor);
  3415. }
  3416.  
  3417.  
  3418. int MW::save_fichier_NOTES(QString date_i)
  3419. {
  3420. // enregisterment incrémentiel sur le disque (nom de fichier = 1..2...3...)
  3421. NOTE note_i;
  3422. // QString s1;
  3423.  
  3424. uint8_t x0a = spinBox_x0a->value();
  3425. double x0b = doubleSpinBox_x0b->value();
  3426.  
  3427. //uint8_t dxa = spinBox_dxa->value();
  3428. double dxb = doubleSpinBox_dxb->value();
  3429.  
  3430. uint16_t n_max = liste_NOTES.length();
  3431. if (n_max == 0)
  3432. {
  3433. QMessageBox msgBox; msgBox.setText("liste NOTES vide !"); msgBox.exec();
  3434. return 1;
  3435. }
  3436.  
  3437. if (date_i == "BAK")
  3438. {
  3439. QMessageBox msgBox;
  3440. QString s1="Fichier BAK.NTS enregistré";
  3441. msgBox.setText(s1); msgBox.exec();
  3442. }
  3443.  
  3444.  
  3445. //int numero=0;
  3446. QString s2;
  3447.  
  3448. Timer1->stop();
  3449.  
  3450. s2 = date_i;
  3451.  
  3452. //QFile file1(string_currentDir + "/" + "NOTES_" + s2 + ".nts");
  3453. QFile file1(string_currentDir + "/" + s2 + ".NTS");
  3454. if (file1.open(QIODevice::WriteOnly | QIODevice::Text))
  3455. {
  3456. QByteArray byteArray1;
  3457. QDataStream stream1(&byteArray1, QIODevice::WriteOnly);
  3458. stream1.setDevice(&file1);
  3459. stream1.setVersion(QDataStream::Qt_6_8);
  3460.  
  3461. // entête 64 octets --------------
  3462. double vts = doubleSpinBox_vitesse->value(); // 8 octets
  3463. stream1 << x0b << dxb << vts << Ta << Tb << x0a; //8+8+8+1+1+1 =27 octets au début du fichier
  3464.  
  3465. for (int i=0; i<(64-27); i++) {stream1 << 'x';} // complète à 64 octets
  3466. //--------------------------------
  3467. for(uint16_t n=0; n<n_max; n++)
  3468. {
  3469. note_i = liste_NOTES[n];
  3470. // sérialisation des data
  3471. stream1 << note_i.numero << note_i.midi << note_i.n_barreT << note_i.n_barreM;
  3472. }
  3473. }
  3474. file1.close();
  3475. return 0;
  3476. }
  3477.  
  3478.  
  3479. void MW::load_fichier_NOTES(QString s0)
  3480. {
  3481. QString filename1;
  3482. QString s1;
  3483.  
  3484. MW::setCursor(Qt::WaitCursor);
  3485.  
  3486. if (s0 == "BAK")
  3487. {
  3488. filename1 = string_currentDir+ "/BAK.NTS";
  3489. }
  3490. else
  3491. {
  3492. if(dossier_de_travail_ok == false)
  3493. {
  3494. choix_dossier_de_travail();
  3495. if (dossier_de_travail_ok == false)
  3496. {
  3497. QMessageBox msgBox;
  3498. s1="Le dossier de travail n'est pas spécifié";
  3499. msgBox.setText(s1); msgBox.exec();
  3500. MW::setCursor(Qt::ArrowCursor);
  3501. return ;
  3502. }
  3503. }
  3504. filename1 = QFileDialog::getOpenFileName(this,
  3505. tr("Ouvrir Fichier NTS"), string_currentDir+"/", tr("Fichiers nts (*.NTS)"));
  3506. }
  3507.  
  3508.  
  3509. lineEdit_fichier->setText(filename1);
  3510. file_dat.setFileName(filename1);
  3511. if (!file_dat.open(QIODevice::ReadOnly))
  3512. {
  3513. data_nts_ok = false;
  3514. MW::setCursor(Qt::ArrowCursor);
  3515. return ;
  3516. }
  3517. else
  3518. {
  3519. binStream1.setDevice(&file_dat); // accès à la totalité du fichier dat
  3520. binStream1.setVersion(QDataStream::Qt_6_8);
  3521. data_nts_ok = true;
  3522. }
  3523.  
  3524. //int z = sizeof(NOTE); // ATTENTION ! ne PAS utiliser cette valeur qui tient en compte l'alignement en RAM
  3525. uint32_t n_max = file_dat.bytesAvailable() / 7; // 7 bits par enr; voir la def de 'NOTE' dans le .h
  3526.  
  3527. uint8_t x0a;
  3528. double x0b;
  3529. uint8_t dxa;
  3530. double dxb;
  3531. double vts;
  3532.  
  3533. // lecture entête -----------------
  3534. binStream1 >> x0b >> dxb >> vts >> Ta >> Tb >> x0a >> dxa; // 8+8+8+1+1+1+1=28 octets au début du fichiers
  3535.  
  3536. uint8_t xx;
  3537. for (int i=0; i<(64-28); i++) {binStream1 >> xx;} // lit en tout à 64 octets
  3538. //---------------------------------
  3539. spinBox_x0a->setValue(x0a);
  3540. doubleSpinBox_x0b->setValue(x0b);
  3541. //spinBox_dxa->setValue(dxa);
  3542. doubleSpinBox_dxb->setValue(dxb);
  3543. doubleSpinBox_vitesse->setValue(vts);
  3544.  
  3545. switch (Ta)
  3546. {
  3547. case 2: {lineEdit_10->setText("2/4"); Ta=2; Tb=4;} break; // Ta et Tb variables globales
  3548. case 3: {lineEdit_10->setText("3/4"); Ta=3; Tb=4;} break;
  3549. case 4: {lineEdit_10->setText("4/4"); Ta=4; Tb=4;} break;
  3550. default: break;
  3551. }
  3552.  
  3553.  
  3554. for(uint32_t n=0; n<n_max; n++)
  3555. {
  3556. NOTE note_i;
  3557. binStream1 >> note_i.numero >> note_i.midi >> note_i.n_barreT >> note_i.n_barreM;
  3558. note_i.statut = 0; // n'est pas sauvegardé ni relu
  3559. liste_NOTES << note_i;
  3560. }
  3561.  
  3562. file_dat.close();
  3563.  
  3564.  
  3565. mode = 'M';
  3566. affiche_liste_notes();
  3567.  
  3568. //on_Bt_toggle_grille_T_clicked();
  3569. Bt_jouer_tout->setStyleSheet("background-color: rgb(0, 255, 0);"); // vert
  3570.  
  3571. MW::setCursor(Qt::ArrowCursor);
  3572.  
  3573. on_Bt_debut_clicked();
  3574. }
  3575.  
  3576.  
  3577. void decale_notes(int d)
  3578. {
  3579. int nb;
  3580. uint32_t i_max = liste_NOTES.length();
  3581. for( int i =0; i<i_max; i++)
  3582. {
  3583. nb = liste_NOTES[i].n_barreT;
  3584. nb += d;
  3585. liste_NOTES[i].n_barreT = nb;
  3586. }
  3587. }
  3588.  
  3589.  
  3590. void MW::on_Bt_load_FREQ_clicked()
  3591. {
  3592. load_fichier_FRQ();
  3593. // on_Bt_toggle_grille_T_clicked();
  3594. // effacer_calque(scene4, );
  3595. effacer_calque(scene5, calque_histogramme );
  3596. // tracer_echelle_temps_TAB_NOTES();
  3597. }
  3598.  
  3599.  
  3600.  
  3601. void MW::on_checkBox_rapide_stateChanged(int arg1)
  3602. {
  3603. rapide=arg1;
  3604. init_TAB_FRQ();
  3605. }
  3606.  
  3607.  
  3608. void MW::on_doubleSpinBox_seuil_valueChanged(double arg1)
  3609. {
  3610. seuil = arg1;
  3611. effacer_calque(scene4, calque_TAB_FRQ);
  3612. retracer_TAB_FRQ();
  3613. }
  3614.  
  3615.  
  3616. void MW::on_checkBox_norm_clicked()
  3617. {
  3618. /*
  3619.   if (checkBox_norm->isChecked())
  3620.   {
  3621.   textEdit_ETAT->setText("Mode Normalisé : \n Les couleurs représentent l'amplitude du signal");
  3622.   }
  3623.   else
  3624.   {
  3625.   textEdit_ETAT->setText(
  3626. "Mode Fréquences : \n"
  3627.  "Les couleurs représentent la valeur (fréquence) de la note (Do, RE, MI...) \n"
  3628.  "La taille de chaque tiret représente (abusivement sur l'axe fréquenciel) l'amplitude du signal \n"
  3629.  "cette taille ne signifie donc pas un étalement en fréquence du signal, c'est juste une astuce de représentation."
  3630.   );
  3631.   }
  3632. */
  3633. effacer_calque(scene4, calque_TAB_FRQ);
  3634. retracer_TAB_FRQ();
  3635. }
  3636.  
  3637.  
  3638. /*
  3639. void MW::surbrille_barre(num_barre)
  3640. {
  3641.  
  3642. }
  3643. */
  3644.  
  3645. void MW::surbrille_note(uint16_t n, bool HRM, int type) // HRM = visu harmoniques
  3646. {
  3647. // HRM true -> visu harmoniques x2 et x3
  3648. double x_note=0;
  3649. QPen pen1;
  3650. //QString couleur1;
  3651. QString blanc = "#FFFFFF";
  3652.  
  3653. NOTE note_i;
  3654. uint16_t n_max = liste_NOTES.length();
  3655. if ( n>= n_max) {return;}
  3656.  
  3657. note_i = liste_NOTES[n];
  3658. if(mode=='T') { x_note = calcul_x_barre(note_i.n_barreT); }
  3659. if(mode=='M') { x_note = calcul_x_barre(note_i.n_barreM); }
  3660.  
  3661. if (checkBox_scrolling->isChecked())
  3662. {
  3663. //int n =0;
  3664. double diff1 =0;
  3665.  
  3666. double xb = GV_grillesTM->horizontalScrollBar()->value();
  3667. diff1= x_note - xb;
  3668.  
  3669. if(diff1 >1700)
  3670. {
  3671. on_Bt_next_clicked();
  3672. on_Bt_next_clicked();
  3673. }
  3674. }
  3675.  
  3676. int y1, y2, y3; // y1=F0; y2 = 2xF0; y3 = 3xF0
  3677. int h1;
  3678. int midi_i;
  3679.  
  3680. midi_i = note_i.midi;
  3681. y1 = calcul_y_note(midi_i);
  3682. y2 = calcul_y_note(midi_i+12);
  3683. y3 = calcul_y_note(midi_i+17);
  3684.  
  3685. if(type == 1)
  3686. {
  3687. pen1.setColor(blanc);
  3688. pen1.setWidth(1);
  3689. ellipse1 = new QGraphicsEllipseItem(x_note-12, y1-12, 24, 24) ; // cercle
  3690. ellipse1->setPen(pen1);
  3691. calque_notes_jouee->addToGroup(ellipse1);
  3692. }
  3693.  
  3694. if(type == 2)
  3695. {
  3696. pen1.setColor(blanc);
  3697. pen1.setWidth(1);
  3698. rectangle1 = new QGraphicsRectItem(x_note-15, y1-15, 30, 30) ; // carré
  3699. rectangle1->setPen(pen1);
  3700. calque_notes_jouee->addToGroup(rectangle1);
  3701. }
  3702.  
  3703.  
  3704. if (HRM== true) // visu harmoniques x2 et x3
  3705. {
  3706. if (y2 > 4) // afin d'éviter d'afficher trop haut ce qui décalerait tout l'affichage
  3707. {
  3708. h1 = calcul_hauteur_note(midi_i+12);
  3709. pen1.setColor(liste_couleurs[h1]);
  3710. rectangle1= new QGraphicsRectItem(x_note-20, y2-1, 40, 2) ;
  3711. rectangle1->setPen(pen1);
  3712. calque_notes_jouee->addToGroup(rectangle1);
  3713. }
  3714.  
  3715. if (y3 > 4) // afin d'éviter d'afficher trop haut ce qui décalerait tout l'affichage
  3716. {
  3717. h1 = calcul_hauteur_note(midi_i+17);
  3718. pen1.setColor(liste_couleurs[h1]);
  3719. rectangle1= new QGraphicsRectItem(x_note-20, y3-1, 40, 2) ;
  3720. rectangle1->setPen(pen1);
  3721. calque_notes_jouee->addToGroup(rectangle1);
  3722. }
  3723. }
  3724.  
  3725. }
  3726.  
  3727.  
  3728. void MW::affiche_temps_barre(int n_barre)
  3729. {
  3730. // affiche le temps de la barre cliquée
  3731. double x = calcul_x_barre(num_barre_saisie);
  3732. double t = calcul_temps(x);
  3733. QString s1;
  3734. s1.setNum(t, 10, 2); // base 10, 2 décimale
  3735. Etiquette(x, 610, 0, s1, "#FFFFFF", "#000000", "#00FFFF", calque_surbrillance);
  3736. }
  3737.  
  3738.  
  3739.  
  3740. void MW::surbrille_barre(int n_barre, QString couleur) // par un trait vertical vert
  3741. {
  3742. // n_barre = 0; // pour TEST
  3743.  
  3744. QPen pen1;
  3745. pen1.setColor(couleur);
  3746. pen1.setWidth(2);
  3747.  
  3748. int x= calcul_x_barre(n_barre);
  3749.  
  3750. ligne1 = new QGraphicsLineItem(x, 200, x, 500);
  3751. ligne1->setPen(pen1);
  3752. effacer_calque(scene4, calque_surbrillance);
  3753. calque_surbrillance->addToGroup(ligne1);
  3754.  
  3755. affiche_temps_barre(n_barre);
  3756. }
  3757.  
  3758.  
  3759. void MW::encadre_groupe_notes(int n_barre_i, int nombre)
  3760. {
  3761. NOTE note_i;
  3762. int midi_i;
  3763. double y_i, y_min, y_max;
  3764.  
  3765. int x1 = calcul_x_barre(n_barre_i);
  3766. int x2 = calcul_x_barre(n_barre_i + nombre);
  3767.  
  3768. int n_max = liste_NOTES.length();
  3769. y_min = 1000;
  3770. y_max = -1;
  3771.  
  3772. for(int n_i=0; n_i<nombre; n_i++)
  3773. {
  3774. for(int n=0; n<n_max; n++)
  3775. {
  3776. note_i = liste_NOTES[n];
  3777. midi_i = note_i.midi;
  3778. if(note_i.n_barreM == n_barre_i+n_i)
  3779. {
  3780. y_i = calcul_y_note(midi_i);
  3781. if (y_i > y_max) {y_max=y_i;}
  3782. if (y_i < y_min) {y_min=y_i;}
  3783. }
  3784. }
  3785. }
  3786.  
  3787. QPen pen1;
  3788. pen1.setColor("#00FFFF");
  3789. pen1.setWidth(1);
  3790.  
  3791. rectangle1= new QGraphicsRectItem(x1-15, y_min-15, x2-x1 +30, y_max-y_min+30) ;
  3792. rectangle1->setPen(pen1);
  3793. calque_surbrillance->addToGroup(rectangle1);
  3794.  
  3795.  
  3796. }
  3797.  
  3798.  
  3799.  
  3800. void MW::complete_ligne(int R)
  3801. {
  3802. // TW_3->setItem(R, 0, new QTableWidgetItem (" ") ); // colonne de numerotation
  3803. complete_case(R, 0, "0", "#000000", "#FFFCDD", false, TW_3);
  3804.  
  3805. TW_3->setItem(R, 1, new QTableWidgetItem (" ") ); // note1
  3806. TW_3->setItem(R, 2, new QTableWidgetItem (" ") ); // note2
  3807. TW_3->setItem(R, 3, new QTableWidgetItem (" ") ); // note3
  3808. TW_3->setItem(R, 4, new QTableWidgetItem (" ") ); // note4
  3809.  
  3810. // TW_3->setItem(R, 4, new QTableWidgetItem (" ") );
  3811. complete_case(R, 5, " ", "#000000", "#FFFCDD", false, TW_3); // cmt
  3812.  
  3813. QTableWidgetItem *Item1 = new QTableWidgetItem();
  3814. Item1->setIcon(QIcon("../images/01.png" ));
  3815. TW_3->setItem(R, 6, Item1 ); // bouton
  3816.  
  3817. // TW_3->setItem(R, 7, new QTableWidgetItem ("0") ); // dt
  3818. complete_case(R, 7, " ", "#000000", "#FFFCDD", false, TW_3);
  3819.  
  3820. TW_3->setItem(R, 8, new QTableWidgetItem ("0") ); // M
  3821. TW_3->setItem(R, 9, new QTableWidgetItem ("0") ); // tps
  3822. TW_3->setItem(R, 10, new QTableWidgetItem ("0") ); // tot
  3823. TW_3->setItem(R, 11, new QTableWidgetItem (" ") ); // ACC (accord type)
  3824. TW_3->setItem(R, 12, new QTableWidgetItem (" ") ); // intervalle de cases (sur le manche) à jouer
  3825. TW_3->setItem(R, 13, new QTableWidgetItem (" ") ); // doigts
  3826. }
  3827.  
  3828.  
  3829. void MW::on_Bt_AddLine_clicked() // à la fin
  3830. {
  3831. int R=TW_3->rowCount();
  3832. TW_3->setRowCount(R+1);
  3833. R=TW_3->rowCount();
  3834. complete_ligne(R-1);
  3835. }
  3836.  
  3837.  
  3838. void MW::on_Bt_AddLine_ici_clicked() // ici
  3839. {
  3840. int R= TW_3->currentRow();
  3841. TW_3->insertRow(R);
  3842. complete_ligne(R);
  3843. }
  3844.  
  3845.  
  3846.  
  3847.  
  3848.  
  3849. void MW::complete_case(int row, int column, QString s1, QColor c1, QColor c2, bool bold1, QTableWidget *QTI)
  3850. {
  3851. QTableWidgetItem *Item1 = new QTableWidgetItem();
  3852. Item1->QTableWidgetItem::setForeground(QColor(c1));
  3853. Item1->QTableWidgetItem::setBackground(QColor(c2));
  3854.  
  3855. QFont font1;
  3856. font1.setBold(bold1);
  3857. Item1->setFont(font1);
  3858. Item1->setTextAlignment(Qt::AlignCenter);
  3859.  
  3860. Item1->setText(s1);
  3861. QTI->setItem(row, column, Item1);
  3862. }
  3863.  
  3864.  
  3865. void MW::affiche_liste_notes() // en TEXTE dans le petit tableau
  3866. {
  3867. NOTE note_i;
  3868. QString s1;
  3869.  
  3870. TW_lst_notes->clear();
  3871. TW_lst_notes->setRowCount(0);
  3872. init_TAB_lst_notes();
  3873.  
  3874. uint32_t n_max = liste_NOTES.length();
  3875. if (n_max == 0) {return;}
  3876.  
  3877. int memo_n_barreM =0;
  3878. for(uint32_t n=0; n<n_max; n++) //n_max
  3879. {
  3880. note_i=liste_NOTES[n];
  3881.  
  3882. int numero = note_i.numero;
  3883. int midi = note_i.midi;
  3884.  
  3885. int n_barreT = note_i.n_barreT;
  3886. int n_barreM = note_i.n_barreM;
  3887. // int duree = n_barreM - memo_n_barreM;
  3888. memo_n_barreM = n_barreM;
  3889. int num_ligne = TW_lst_notes->rowCount();
  3890. TW_lst_notes->setRowCount(num_ligne+1); // ajout une ligne au tableau
  3891.  
  3892. s1.setNum(numero);
  3893.  
  3894. complete_case(n, 0, s1, "000000", "#FFFFFF", false, TW_lst_notes);
  3895.  
  3896. s1.setNum(midi);
  3897. int h1 = calcul_hauteur_note(midi);
  3898.  
  3899. QString couleur1 = liste_couleurs[h1];
  3900. complete_case(n, 1, s1, "#000000", couleur1, true, TW_lst_notes);
  3901.  
  3902. s1 = nom_note(midi);
  3903. complete_case(n, 2, s1, "#000000", "#FFFFFF", false, TW_lst_notes);
  3904.  
  3905. s1.setNum(n_barreT);
  3906. complete_case(n, 3, s1, "#FFFF00", "#555555", true, TW_lst_notes);
  3907.  
  3908. s1.setNum(n_barreM);
  3909. complete_case(n, 4, s1, "#000000", "#FFFFFF", false, TW_lst_notes);
  3910.  
  3911. // s1.setNum(duree);
  3912. // complete_case(n, 5, s1, "#000000", "#FFFFFF", false, TW_lst_notes);
  3913. }
  3914. //tableWidget_lst_notes->AdjustToContents;
  3915. affiche_histogramme();
  3916. }
  3917.  
  3918.  
  3919. void MW::affiche_histogramme_durees()
  3920. {
  3921. int x;
  3922. double dy;
  3923. double echelle;
  3924. QBrush br1;
  3925. QString couleur1;
  3926. QString s1;
  3927.  
  3928. effacer_calque(scene5, calque_histogramme);
  3929.  
  3930. GraphicsTextItem = new QGraphicsTextItem("Histogramme des durées \n en nb de barres 1/40s");
  3931. GraphicsTextItem->setFont(QFont("Arial", 12));
  3932. GraphicsTextItem->setDefaultTextColor("#FFFFFF");
  3933. GraphicsTextItem->setPos(100, -160);
  3934. calque_histogramme->addToGroup(GraphicsTextItem);
  3935.  
  3936. //calcul de la valeur la plus grande
  3937. int total=0;
  3938. for(int n=0; n<=20; n++) // attention à ne pas dépasser la taille de la table...
  3939. {
  3940. dy = table_histogramme_durees[n];
  3941. if (dy > total ) {total = dy;}
  3942. }
  3943. //calcul échelle y
  3944. if (total == 0) {total = 1;}
  3945. echelle = 150.0 / total;
  3946.  
  3947. for(int n=0; n<=30; n++) // attention à ne pas dépasser la taille de la table...
  3948. {
  3949. x = 10*n;
  3950. dy = echelle * table_histogramme_durees[n];
  3951. dy = -dy;
  3952. rect1 = new QGraphicsRectItem(x, 0, 2, dy);
  3953.  
  3954. couleur1="#AAFFFF";
  3955. br1.setStyle(Qt::SolidPattern);
  3956. br1.setColor(QColor(couleur1));
  3957.  
  3958. rect1->setPen(QColor(couleur1));
  3959. rect1->setBrush(br1);
  3960. calque_histogramme->addToGroup(rect1);
  3961.  
  3962. if (n%2 == 0)
  3963. {
  3964. x = -5 + 20*n;
  3965. s1.setNum(n);
  3966. GraphicsTextItem = new QGraphicsTextItem(s1);
  3967. GraphicsTextItem->setFont(QFont("Arial", 10));
  3968. GraphicsTextItem->setDefaultTextColor("#FFFFFF");
  3969. GraphicsTextItem->setPos(x, 0);
  3970. calque_histogramme->addToGroup(GraphicsTextItem);
  3971. }
  3972. }
  3973. }
  3974.  
  3975.  
  3976.  
  3977. void MW::calcul_histogramme_durees()
  3978. {
  3979. uint32_t n_max = liste_NOTES.length();
  3980. if (n_max == 0) {return;}
  3981.  
  3982. for(int i=0; i<35; i++) { table_histogramme_durees[i]=0; } // RAZ
  3983.  
  3984. for(uint32_t n=1; n<n_max; n++) // attention: =1 et pas =0 because 'liste_NOTES[n-1]' ci-dessous !
  3985. {
  3986. int duree = liste_NOTES[n].n_barreT - liste_NOTES[n-1].n_barreT;
  3987. if (duree >0) {table_histogramme_durees[duree]++;}
  3988. }
  3989. }
  3990.  
  3991.  
  3992. void MW::affiche_histogramme_midi()
  3993. {
  3994. int x;
  3995. double dy;
  3996. double echelle;
  3997. QBrush br1;
  3998. QString couleur1;
  3999. QString s1;
  4000.  
  4001. effacer_calque(scene5, calque_histogramme);
  4002.  
  4003. GraphicsTextItem = new QGraphicsTextItem("Histogramme des notes midi");
  4004. GraphicsTextItem->setFont(QFont("Arial", 12));
  4005. GraphicsTextItem->setDefaultTextColor("#FFFFFF");
  4006. GraphicsTextItem->setPos(100, -160);
  4007. calque_histogramme->addToGroup(GraphicsTextItem);
  4008.  
  4009. //calcul de la valeur la plus grande
  4010. int total=0;
  4011. for(int n=0; n<_Hmax; n++) // 42, attention à ne pas dépasser la taille de la table...
  4012. {
  4013. dy = table_histogramme_midi[n];
  4014. if (dy > total ) {total = dy;}
  4015. }
  4016. //calcul échelle y
  4017. if (total == 0) {total = 1;}
  4018. echelle = 150.0 / total;
  4019.  
  4020. for(int n=0; n<=40; n++) // 42 attention à ne pas dépasser la taille de la table...
  4021. {
  4022. x = 10*n;
  4023. dy = echelle * table_histogramme_midi[n];
  4024. dy = -dy;
  4025. rect1 = new QGraphicsRectItem(x, 0, 5, dy);
  4026.  
  4027. couleur1="#AAFFFF";
  4028. int h1 = calcul_hauteur_note(n+40);
  4029. QString couleur1 = liste_couleurs[h1];
  4030. br1.setStyle(Qt::SolidPattern);
  4031. br1.setColor(QColor(couleur1));
  4032.  
  4033. rect1->setPen(QColor(couleur1));
  4034. rect1->setBrush(br1);
  4035. calque_histogramme->addToGroup(rect1);
  4036.  
  4037. if (n%2== 0)
  4038. {
  4039. x = -5 + 10*n;
  4040. s1.setNum(n+40);
  4041. GraphicsTextItem = new QGraphicsTextItem(s1);
  4042. GraphicsTextItem->setFont(QFont("Arial", 10));
  4043. GraphicsTextItem->setDefaultTextColor("#FFFFFF");
  4044. GraphicsTextItem->setPos(x, 0);
  4045. calque_histogramme->addToGroup(GraphicsTextItem);
  4046. }
  4047. }
  4048. }
  4049.  
  4050.  
  4051. void MW::calcul_histogramme_midi()
  4052. {
  4053. for(int i=0; i<42; i++)
  4054. {
  4055. table_histogramme_midi[i]=0; // RAZ
  4056. }
  4057.  
  4058. uint16_t n_max = liste_NOTES.length();
  4059.  
  4060. for(int n=0; n<n_max; n++)
  4061. {
  4062. int M=liste_NOTES[n].midi;
  4063. if ((M>=40)&&(M<=84)) { table_histogramme_midi[M-40]++;}
  4064. }
  4065. }
  4066.  
  4067. /*
  4068. Liste des correspondances en fonction des dièses présents à la clef :
  4069. Pas d'altération : Do Majeur
  4070.  Fa# : Sol Majeur
  4071.  Fa#, Do# -> gamme de Ré Majeur
  4072.  Fa#, Do#, Sol# -> gamme de La Majeur
  4073.  Fa#, Do#, Sol#, Ré# -> gamme de Mi Majeur
  4074.  Fa#, Do#, Sol#, Ré#, La# -> gamme de Si Majeur
  4075.  Fa#, Do#, Sol#, Ré#, La#, Mi# -> gamme de Fa dièse Majeur
  4076.  Fa#, Do#, Sol#, Ré#, La#, Mi#, Si# -> gamme de Do dièse Majeur
  4077. */
  4078.  
  4079.  
  4080. QString MW::denombre_diezes_a_la_cle()
  4081. {
  4082. // FA♯ DO♯ SOL♯ RÉ♯ LA♯ MI♯ SI♯
  4083. // 42 49 56 51 46 53 48 // midi
  4084. // 6 1 8 3 10 5 0 (reportées dans la première octave)
  4085.  
  4086. QString s1, s2;
  4087. int N;
  4088. int FA=0, DO=0, SOL=0, RE=0, LA=0; //, MI=0, SI=0;
  4089. s1="";
  4090. if (table_histogramme_degre[6] > 0) {FA=1; s1+=" FA#";}
  4091. if ((table_histogramme_degre[1] > 0)&&(FA==1)) {DO=1; s1+= " DO#";}
  4092. if ((table_histogramme_degre[8] > 0)&&(DO==1)) {SOL=1; s1+= " SOL#";}
  4093. if ((table_histogramme_degre[3] > 0)&&(SOL==1)) {RE=1; s1+= " RE#";}
  4094. if ((table_histogramme_degre[10] > 0)&&(RE==1)) {LA=1; s1+= " LA#";}
  4095. if ((table_histogramme_degre[5] > 0)&&(LA==1)) {s1+= " MI#";}
  4096. // if ((table_histogramme_degre[0] > 0)&&(MI==1)) {SI=1; s1+= " SI#";}
  4097.  
  4098. N = FA+DO+SOL+RE+LA;
  4099. s2.setNum(N);
  4100. s2+=" dièse";
  4101. if (N>1) {s2+="s";}
  4102. s2+=" à la clé " ;
  4103. s2 += s1;
  4104. return s2;
  4105. }
  4106.  
  4107.  
  4108. void MW::affiche_histogramme_degre()
  4109. {
  4110.  
  4111. int y1, y2;
  4112. double dx;
  4113. double echelle;
  4114. QBrush br1;
  4115. QString couleur1;
  4116. QString s1;
  4117.  
  4118. effacer_calque(scene5, calque_histogramme);
  4119.  
  4120. GraphicsTextItem = new QGraphicsTextItem("Histogramme des degrés (gamme chromatique)");
  4121. GraphicsTextItem->setFont(QFont("Arial", 10));
  4122. GraphicsTextItem->setDefaultTextColor("#FFFFFF");
  4123. GraphicsTextItem->setPos(8, -170);
  4124. calque_histogramme->addToGroup(GraphicsTextItem);
  4125.  
  4126. //calcul de la valeur la plus grande
  4127. int total=0;
  4128. for(int n=0; n<12; n++) // attention à ne pas dépasser la taille de la table...
  4129. {
  4130. dx = table_histogramme_degre[n];
  4131. if (dx > total ) {total = dx;}
  4132. }
  4133. //calcul échelle y
  4134. if (total == 0) {total = 1;}
  4135. echelle = 150.0 / total;
  4136.  
  4137. for(int n=0; n<12; n++)
  4138. {
  4139. y1 = 20 - 10*n;
  4140. dx = echelle * table_histogramme_degre[n];
  4141. if (dx>0)
  4142. {
  4143. rect1 = new QGraphicsRectItem(40, y1, dx, 4);
  4144.  
  4145. couleur1="#AAFFFF";
  4146. int h1 = n;
  4147. QString couleur1 = liste_couleurs[h1];
  4148. br1.setStyle(Qt::SolidPattern);
  4149. br1.setColor(QColor(couleur1));
  4150.  
  4151. rect1->setPen(QColor(couleur1));
  4152. rect1->setBrush(br1);
  4153. calque_histogramme->addToGroup(rect1);
  4154. }
  4155.  
  4156. y2 = 12 - 10*n;
  4157. //s1.setNum(n+1);
  4158. s1=gamme_chromatique_b[n];
  4159. GraphicsTextItem = new QGraphicsTextItem(s1);
  4160. GraphicsTextItem->setFont(QFont("Arial", 8));
  4161. GraphicsTextItem->setDefaultTextColor(couleur1);
  4162. GraphicsTextItem->setPos(0, y2);
  4163. calque_histogramme->addToGroup(GraphicsTextItem);
  4164.  
  4165. }
  4166.  
  4167. s1 = denombre_diezes_a_la_cle();
  4168. Etiquette(10, -140, 0, s1, "#FFFF00", "#000000", "#FFFFFF", calque_histogramme );
  4169. }
  4170.  
  4171.  
  4172.  
  4173. void MW::calcul_histogramme_degre() // degres de la gamme chromatique (= 1..12 )
  4174. {
  4175. for(int n=0; n<12; n++)
  4176. {
  4177. table_histogramme_degre[n]=0; // RAZ
  4178. }
  4179.  
  4180. uint16_t n_max = liste_NOTES.length();
  4181.  
  4182. for(int n=0; n<n_max; n++)
  4183. {
  4184. int M=liste_NOTES[n].midi;
  4185. if ((M>=40)&&(M<=84))
  4186. {
  4187. //int midi = M-40;
  4188. int H = calcul_hauteur_note(M);
  4189. table_histogramme_degre[H]++;
  4190. }
  4191. }
  4192. }
  4193.  
  4194.  
  4195. void MW::affiche_histogramme()
  4196. {
  4197.  
  4198. //la suite fait planter !
  4199.  
  4200. if(radioButton_D->isChecked())
  4201. {
  4202. calcul_histogramme_durees();
  4203. affiche_histogramme_durees();
  4204. }
  4205. if(radioButton_M->isChecked())
  4206. {
  4207. calcul_histogramme_midi();
  4208. affiche_histogramme_midi();
  4209. }
  4210. if(radioButton_H->isChecked())
  4211. {
  4212. calcul_histogramme_degre();
  4213. affiche_histogramme_degre();
  4214. }
  4215. }
  4216.  
  4217.  
  4218. void MW::trace_liste_notes() //dessine des cercles colorés (couleur midi) sur la grille
  4219. {
  4220. tri_liste_notes_par_num_barre(); //les notes seront triées par temps croissant
  4221. numerotation_liste_notes();
  4222.  
  4223. effacer_calque(scene4,calque_notes_manuelles);
  4224. effacer_calque(scene4,calque_notes_jouee);
  4225.  
  4226. QString s1;
  4227. int midi_i;
  4228. double x, dx, y;
  4229. double x_suivante;
  4230. int numero;
  4231. uint32_t n_max = liste_NOTES.length();
  4232. int n_barre_1, n_barre_suivante=0;
  4233. int x0a = spinBox_x0a->value();
  4234. double x0b = 10.0 * doubleSpinBox_x0b->value();
  4235. x0b += 20.0 * x0a;
  4236. QString blanc = "#FFFFFF";
  4237. QString jaune = "#FFFF00";
  4238. // QString cyan = "#00FFFF";
  4239.  
  4240. for(uint32_t n=0; n<n_max; n++)
  4241. {
  4242. n_barre_1=0;
  4243. if (mode=='T') {n_barre_1 = liste_NOTES[n].n_barreT; }
  4244. if (mode=='M')
  4245. {
  4246. n_barre_1 = liste_NOTES[n].n_barreM;
  4247. if (n < n_max-1) { n_barre_suivante = liste_NOTES[n+1].n_barreM;}
  4248. else {n_barre_suivante = num_barre_saisie;}
  4249. }
  4250. //memo_x = x;
  4251. x = calcul_x_barre(n_barre_1);
  4252. x_suivante = calcul_x_barre(n_barre_suivante);
  4253. dx = x_suivante -x;
  4254. midi_i = liste_NOTES[n].midi;
  4255.  
  4256. if ((midi_i >=28) && (midi_i <=86) )
  4257. {
  4258. y = calcul_y_note(midi_i);
  4259. int h1 = calcul_hauteur_note(midi_i);
  4260. QString couleur1 = liste_couleurs[h1];
  4261. ellipse1 = new QGraphicsEllipseItem(x-8, y-8, 16, 16); // cercle
  4262. if (mode=='T') {ellipse1->setPen(QColor(jaune));}
  4263. if (mode=='M') {ellipse1->setPen(QColor(blanc));}
  4264. ellipse1->setBrush(QColor(couleur1));
  4265. calque_notes_manuelles->addToGroup(ellipse1);
  4266.  
  4267. // marque la durée des notes par un fin rectangle horizontal
  4268. if ( (mode_composition = true) && (mode == 'M') && (visu_freq == 0) && (n<n_max-1) )
  4269. {
  4270. rectangle1 = new QGraphicsRectItem(x, y-2, dx, 4);
  4271. rectangle1->setPen(QColor(couleur1));
  4272. calque_notes_manuelles->addToGroup(rectangle1);
  4273. }
  4274.  
  4275. // inscrit le numéro de la note au centre de la note
  4276. numero = liste_NOTES[n].numero;
  4277. s1.setNum(numero);
  4278. GraphicsTextItem = new QGraphicsTextItem(s1);
  4279. GraphicsTextItem->setFont(QFont("Arial", 8));
  4280. GraphicsTextItem->setDefaultTextColor("#000000");
  4281. int x2 = x-12; if(numero<10){x2+=4;}
  4282. GraphicsTextItem->setPos(x2, y-10);
  4283. calque_notes_manuelles->addToGroup(GraphicsTextItem);
  4284. }
  4285. if( liste_NOTES[n].statut & 0b00000001 == 0b00000001) {surbrille_note(n, false, 2);}
  4286. }
  4287. tracer_echelle_temps_TAB_NOTES();
  4288. }
  4289.  
  4290.  
  4291. void MW::numerotation_liste_notes()
  4292. {
  4293. uint16_t i_max = liste_NOTES.length();
  4294.  
  4295. for(uint16_t n=0; n<i_max; n++)
  4296. {
  4297. liste_NOTES[n].numero = n;
  4298. }
  4299. }
  4300.  
  4301.  
  4302. void MW::suppression_notes_invalides()
  4303. {
  4304. int midi;
  4305. int nb = 0;
  4306. uint16_t n_max = liste_NOTES.length();
  4307. if (n_max == 0) {return;}
  4308. bool boucler=true;
  4309. do
  4310. {
  4311. nb=0;
  4312. for(uint16_t n=0; n<n_max; n++)
  4313. {
  4314. midi = liste_NOTES[n].midi;
  4315. if ((midi <28) || (midi>86))
  4316. {
  4317. supprime_note(n);
  4318. if (n_max == 0) {return;}
  4319. n_max --;
  4320. nb++;
  4321. }
  4322. }
  4323. if (nb==0) {boucler=false;}
  4324. }
  4325. while (boucler == true);
  4326. }
  4327.  
  4328.  
  4329. void MW::suppression_mesures()
  4330. {
  4331. //int midi;
  4332. uint16_t n_max = liste_NOTES.length();
  4333. int nb = 0;
  4334.  
  4335. bool boucler=true;
  4336. do
  4337. {
  4338. nb=0;
  4339. for(int n=0; n<n_max; n++)
  4340. {
  4341. //midi = liste_NOTES[n].midi;
  4342. /*
  4343.   if (midi == 100) // midi=100 codera pour les barres de mesures
  4344.   {
  4345.   supprime_note(n);
  4346.   n_max --;
  4347.   nb++;
  4348.   }
  4349. */
  4350. }
  4351. if (nb==0) {boucler=false;}
  4352. }
  4353. while (boucler == true);
  4354.  
  4355. }
  4356.  
  4357.  
  4358.  
  4359. void MW::tri_liste_notes_par_num_barre()
  4360. {
  4361.  
  4362. // tri par bulles
  4363.  
  4364. int ba1=0, ba2=0; // barres
  4365. NOTE note_i;
  4366. uint16_t i_max = liste_NOTES.length();
  4367. if (i_max==0){return;}
  4368.  
  4369. for(int p=0; p<i_max; p++)
  4370. {
  4371. for(int n=0; n<i_max-1; n++)
  4372. {
  4373. if(mode=='T')
  4374. {
  4375. ba1=liste_NOTES[n].n_barreT;
  4376. ba2=liste_NOTES[n+1].n_barreT;
  4377. }
  4378. if(mode=='M')
  4379. {
  4380. ba1=liste_NOTES[n].n_barreM;
  4381. ba2=liste_NOTES[n+1].n_barreM;
  4382. }
  4383.  
  4384. if(ba1 > ba2)
  4385. {
  4386. //permutter les notes
  4387. note_i = liste_NOTES[n];
  4388. liste_NOTES[n] = liste_NOTES[n+1];
  4389. liste_NOTES[n+1] = note_i;
  4390. }
  4391. }
  4392. }
  4393. }
  4394.  
  4395.  
  4396.  
  4397. void MW::ajout_note(int midi, int n_barreT, int n_barreM)
  4398. {
  4399. // ajout d'une note à la fin de la liste 'liste_NOTES[]'
  4400. NOTE note_i;
  4401. note_i.midi = midi;
  4402. note_i.n_barreT = n_barreT; // valeur discrète, entière : numéro de la barre de la grille temporelle
  4403. note_i.n_barreM = n_barreM;
  4404. liste_NOTES << note_i;
  4405. tri_liste_notes_par_num_barre();
  4406. }
  4407.  
  4408.  
  4409. void MW::deplace_note(int num, int DG, int HB)
  4410. {
  4411. //if (n<=0) {return;}
  4412. if (num >= liste_NOTES.length()) {return;}
  4413. NOTE note_i;
  4414. note_i = liste_NOTES[num];
  4415. if (mode == 'T')
  4416. {
  4417. note_i.n_barreT = note_i.n_barreT+DG;
  4418. note_i.midi = note_i.midi+HB;
  4419. }
  4420. if (mode == 'M')
  4421. {
  4422. note_i.n_barreM = note_i.n_barreM+DG;
  4423. note_i.midi = note_i.midi+HB;
  4424. }
  4425. liste_NOTES[num] = note_i;
  4426. surbrille_note(num, true, 1);
  4427. }
  4428.  
  4429.  
  4430. void MW::duplique_notes(int n_barreM_1, int n_barreM_2, int nombre)
  4431. {
  4432. NOTE note_i;
  4433. int midi_i;
  4434. int n_max = liste_NOTES.length();
  4435.  
  4436. for (int n_i = 0; n_i < nombre; n_i ++)
  4437. {
  4438. for(int n=0; n<n_max; n++)
  4439. {
  4440. note_i = liste_NOTES[n];
  4441. midi_i = note_i.midi;
  4442. if(note_i.n_barreM == n_barreM_1+n_i)
  4443. {
  4444. ajout_note(midi_i, 0, n_barreM_2+n_i);
  4445. }
  4446. }
  4447.  
  4448. }
  4449. }
  4450.  
  4451.  
  4452. void MW::supprime_note(int16_t n)
  4453. {
  4454. int n_max = liste_NOTES.length();
  4455. if ( (n>=0) && (n<n_max) )
  4456. {
  4457. liste_NOTES.remove(n);
  4458. effacer_calque(scene4, calque_notes_manuelles);
  4459. tri_liste_notes_par_num_barre(); //les notes seront triées par temps croissant
  4460. numerotation_liste_notes(); //les notes seront numérotées par temps croissant
  4461. trace_liste_notes();
  4462. }
  4463. }
  4464.  
  4465.  
  4466.  
  4467. int MW::test_if_note_in_liste(int16_t n_barre, int midi)
  4468. {
  4469. // retourne la position dans la liste, sinon zéro;
  4470. int16_t barre_i=0; // accepte nb négatifs
  4471. int midi_i;
  4472. int i_max = liste_NOTES.length();
  4473. for(int n=0; n<i_max; n++)
  4474. {
  4475. if(mode=='T') {barre_i = liste_NOTES[n].n_barreT;}
  4476. if(mode=='M') {barre_i = liste_NOTES[n].n_barreM;}
  4477.  
  4478. midi_i = liste_NOTES[n].midi;
  4479.  
  4480. // int diff_n = abs(barre_i-n_barre);
  4481. //if ((diff_n ==0) && (midi_i == midi))
  4482.  
  4483. if ((barre_i == n_barre) && (midi_i == midi))
  4484. {
  4485. return n;
  4486. }
  4487. }
  4488. return -1000;
  4489. }
  4490.  
  4491.  
  4492. uint16_t MW::calcul_n_barreM_note(uint32_t n)
  4493. //numero de la barre M la plus proche de la note posée sur une barre T
  4494. {
  4495. uint16_t nT = liste_NOTES[n].n_barreT;
  4496.  
  4497. mode='T';
  4498. int xT = calcul_x_barre(nT);
  4499.  
  4500. int trouve = 0;
  4501. int32_t i =-250;
  4502.  
  4503. mode='M';
  4504.  
  4505. // int x0a = spinBox_x0a->value();
  4506. // double x0b = 10.0 * doubleSpinBox_x0b->value();
  4507. // x0b += 20.0 * x0a;
  4508.  
  4509. while ((trouve == 0) && (i<16000))
  4510. {
  4511. double xi = calcul_x_barre(i);
  4512. double diff = xT - xi;
  4513. if(diff<0)diff = -diff;
  4514.  
  4515. if(diff < calcul_pas_grille() /2 )
  4516. {
  4517. trouve = 1;
  4518. }
  4519. i++;
  4520. }
  4521. if (trouve == 0) {i=1;}
  4522. mode='T';
  4523. return i-1;
  4524. }
  4525.  
  4526.  
  4527. uint16_t MW::calcul_n_barreT_note(uint32_t n)
  4528. {
  4529. //numero de la barre T la plus proche de la note posée sur une barre M
  4530. //toutefois cette fonction est à revoir, HS telle-quelle !
  4531.  
  4532. int32_t nM = liste_NOTES[n].n_barreM;
  4533. mode='M';
  4534. int xM = calcul_x_barre(nM);
  4535.  
  4536.  
  4537. int trouve = 0;
  4538. int32_t i = -500;
  4539. //spinBox_x0a->setValue(0);
  4540.  
  4541. mode='T';
  4542. double pas_T = calcul_pas_grille();
  4543. while ((trouve == 0) && (i<16000))
  4544. {
  4545. double xi = calcul_x_barre(i);
  4546. if (xi>0)
  4547. {
  4548. double diff = xM - xi;
  4549. if(diff<0)
  4550. {
  4551. diff = -diff;
  4552. }
  4553. if(diff < (pas_T /1.5) )
  4554. {
  4555. trouve = 1;
  4556. }
  4557. }
  4558. i++;
  4559. }
  4560. if (trouve == 0) {i=1;}
  4561. mode='M';
  4562. return i-1;
  4563. }
  4564.  
  4565.  
  4566.  
  4567. void MW::affi_txt_en_couleur(int midi_i, QLineEdit *lineEdit_i)
  4568. {
  4569. int h1 = calcul_hauteur_note(midi_i);
  4570.  
  4571. QString c1 = liste_couleurs[h1];
  4572. QString c2 = "#000000";
  4573. lineEdit_i->setStyleSheet("color: " + c1 + "; background-color: " + c2 + "; font: 700 14pt 'Ubuntu';");
  4574. }
  4575.  
  4576.  
  4577.  
  4578. void MW::encadre_midi(int n_midi) // sur l'onglet 'NOTES' dans la liste des notes à gauche
  4579. {
  4580. //n_midi = 50; /// pour test (ok)
  4581.  
  4582. if ((n_midi<28) || (n_midi>86)) {return;}
  4583.  
  4584. effacer_calque(scene4, calque_noms_notes);
  4585. tracer_graduation_TAB_NOTES();
  4586. double x, dx, y1, y2, dy;
  4587.  
  4588. int dm = n_midi -28;
  4589. y1 = 701 - (dm * 12); // 677
  4590.  
  4591. dy=12;
  4592. x=0;
  4593. dx=70;
  4594.  
  4595. rectangle1 = new QGraphicsRectItem(x, y1, dx, dy);
  4596. QPen pen1;
  4597. pen1.setColor("#FFFFFF");
  4598. pen1.setWidth(1);
  4599. rectangle1->setPen(pen1);
  4600. calque_noms_notes->addToGroup(rectangle1);
  4601.  
  4602.  
  4603. if (! checkBox_sel_boite->isChecked())
  4604. {
  4605. y2 = y1 + 6;
  4606. ligne1 = new QGraphicsLineItem(80, y2, 12000, y2); // ligne horizontale sur toute la largeur du calque
  4607. ligne1->setPen(pen1);
  4608. calque_surbrillance->addToGroup(ligne1);
  4609. }
  4610.  
  4611. }
  4612.  
  4613.  
  4614. int MW::calcul_num_barre(double xi) // en fonction de la position x
  4615. {
  4616. //double pas_grille = spinBox_dxa->value()/2.0 * zoom_x; // pas de la grille
  4617. //double offset_grille = 0; //75;
  4618. //double x_barre = offset_grille; //0
  4619.  
  4620. int n_barre=0; // numero de la barre verticale de la grille T temporelle (depuis le départ)
  4621. double x_barre=0;
  4622. double dx2;
  4623. bool trouve = false; // à priori
  4624. int n =-100; // -100 nb négatif pour prendre en compte les notes situées en amont (à gauche) de la barre zéro
  4625. while ((n<2000) && (trouve == false))
  4626. {
  4627. dx2 = xi - x_barre; // comparaison
  4628. if (dx2<0) {dx2 = -dx2;}
  4629.  
  4630. if (dx2 < calcul_pas_grille()/2.0)
  4631. {
  4632. trouve = true;
  4633. n_barre = n; // numero de la barre verticale de la grille temporelle
  4634. }
  4635. x_barre = calcul_x_barre(n+1); // on fait évoluer x_barre à la position suivante
  4636. n++;
  4637. }
  4638.  
  4639. if (trouve == false) {return -1000;}
  4640. //if (n==0) {return -1000;}
  4641.  
  4642. return n_barre;
  4643. }
  4644.  
  4645.  
  4646.  
  4647. int MW::recherche_note(double y_i)
  4648. {
  4649. // recherche (verticale) de la note midi la plus proche du point cliqué
  4650. int dm =-1;
  4651. for(int n=0; n<=58; n++)
  4652. {
  4653. int d1= (696+12-y_i) - 12*n; // 704 684 696
  4654. //d1=abs(d1);
  4655. if(d1<0){d1= -d1;}
  4656. if(d1 <= 5) { dm = n; } // 5 sachant que l'espacement (vertical) de niveaux est = 12
  4657. }
  4658. return dm;
  4659. }
  4660.  
  4661.  
  4662. void MW::recherche_notes_rect(int x0, int y0, int x1, int y1)
  4663. {
  4664. // recherche des notes comprises dans un rectangle
  4665.  
  4666. int n_max = liste_NOTES.length();
  4667. for (int n=0; n< n_max; n++)
  4668. {
  4669. int n_barre_i = liste_NOTES[n].n_barreM;
  4670. int midi_i = liste_NOTES[n].midi;
  4671. double x = calcul_x_barre(n_barre_i);
  4672. double y = calcul_y_note(midi_i);
  4673.  
  4674. if ((x >= x0) && (x <= x1) && (y >= y0) && (y <= y1) )
  4675. {
  4676. liste_NOTES[n].statut |= 0b00000001 ;
  4677. surbrille_note(n, false, 2);
  4678. }
  4679. }
  4680. }
  4681.  
  4682.  
  4683.  
  4684. void MW::mouseMoveEvent(QMouseEvent *event) // actif si le clic de droite reste appuyé
  4685. {
  4686. double x0, y0; // position cliquée
  4687. int midi=0;
  4688. int dm =0;
  4689.  
  4690. double scroll_x = GV_grillesTM->horizontalScrollBar()->value();
  4691. double scroll_y = GV_grillesTM->verticalScrollBar()->value();
  4692.  
  4693. x_clic_ecran = event->position().x();
  4694. y_clic_ecran = event->position().y();
  4695.  
  4696. x0 = x_clic_ecran-2 + scroll_x; // position cliquée
  4697. y0 = y_clic_ecran-78 + scroll_y; // 78
  4698.  
  4699. // recherche (verticale) de la note midi la plus proche du point cliqué
  4700.  
  4701. dm = recherche_note(y0);
  4702. if (dm == -1) {return;}
  4703.  
  4704. // calcul de la valeur midi de la note
  4705. midi = 28 + dm;
  4706.  
  4707. effacer_calque(scene4, calque_rect_select);
  4708. effacer_calque(scene4, calque_surbrillance);
  4709. encadre_midi(midi);
  4710.  
  4711. affi_details_note(midi);
  4712.  
  4713. // sélection par boite
  4714. if (checkBox_sel_boite->isChecked())
  4715. {
  4716.  
  4717. x0_boite = x_clic_GRV4;
  4718. x1_boite = x0;
  4719. // if(x1_boite <= x0_boite) { x1_boite=x0_boite +1; }
  4720. y0_boite = y_clic_GRV4 -8.0;
  4721. y1_boite = y0;
  4722. // if(y1_boite <= y0_boite) { y1_boite=y0_boite +1; }
  4723.  
  4724. // rectangle1 = new QGraphicsRectItem(x_clic_GRV4, y_clic_GRV4 -8.0, x0 - x_clic_GRV4, y0 - y_clic_GRV4);
  4725. rectangle1 = new QGraphicsRectItem(x0_boite, y0_boite -8.0, x1_boite - x0_boite, y1_boite - y0_boite);
  4726. QPen pen1;
  4727. pen1.setColor("#F57900");
  4728. pen1.setWidth(1);
  4729. rectangle1->setPen(pen1);
  4730. calque_rect_select->addToGroup(rectangle1);
  4731.  
  4732. deselect_notes();
  4733. int x0 = x0_boite;
  4734. int y0 = y0_boite;
  4735. int x1 = x1_boite;
  4736. int y1 = y1_boite;
  4737.  
  4738. // permutations si la boite est saisie de droite à gauche et/ou de bas en haut
  4739. int xi, yi;
  4740. if(x1 < x0) {xi=x0; x0=x1; x1=xi;}
  4741. if(y1 < y0) {yi=y0; y0=y1; y1=yi;}
  4742.  
  4743. //effacer_calque(scene4, calque_notes_jouee);
  4744. recherche_notes_rect(x0, y0, x1, y1);
  4745. // trace_liste_notes();
  4746. }
  4747.  
  4748. }
  4749.  
  4750.  
  4751.  
  4752.  
  4753. void MW::affi_details_note(int midi)
  4754. {
  4755. QString s1;
  4756. s1.setNum(midi);
  4757. lineEdit_7->setText(s1);
  4758.  
  4759. affi_txt_en_couleur(midi, lineEdit_7b);
  4760. lineEdit_7b->setText(nom_note(midi));
  4761.  
  4762. affi_txt_en_couleur(midi, lineEdit_7e);
  4763.  
  4764. s1=nom_note_GB(midi);
  4765. s1+=nom_octave_GB(midi);
  4766. lineEdit_7e->setText(s1);
  4767.  
  4768. double F = freq_mid(midi);
  4769. s1.setNum(F);
  4770. s1.replace('.',','); // ce qui permet un copié-collé direct dans 'Adacity'
  4771. lineEdit_7d->setText(s1);
  4772. }
  4773.  
  4774.  
  4775. void MW::mouseReleaseEvent(QMouseEvent *event)
  4776. {
  4777. // sert à ajouter une note (en write_mode 1) lorsqu'on relache le clic
  4778. // tant que le clic de droite reste enfoncé cela permet de confirmer la note midi qui sera ajoutée
  4779. // (mise en surbrillance en temps réel de la valeur midi dans la colonne de gauche)
  4780.  
  4781. QString s1;
  4782. double x0, y0; // position cliquée
  4783. int n_barre=0; // numero de la barre verticale de la grille temporelle (depuis le départ)
  4784. int n2=0;
  4785. int midi=0;
  4786. int dm =0;
  4787.  
  4788. double scroll_x = GV_grillesTM->horizontalScrollBar()->value();
  4789. double scroll_y = GV_grillesTM->verticalScrollBar()->value();
  4790.  
  4791. x_clic_ecran = event->position().x();
  4792. y_clic_ecran = event->position().y();
  4793.  
  4794. x0 = x_clic_ecran-2 + scroll_x; // position cliquée
  4795. y0 = y_clic_ecran-78 + scroll_y;
  4796.  
  4797. dm = recherche_note(y0);
  4798.  
  4799. if (dm == -1) {return;}
  4800.  
  4801. midi = 28 + dm; // calcul de la valeur midi de la note
  4802. qDebug() << "midi" << midi; // ok
  4803.  
  4804. n_barre = calcul_num_barre(x0);
  4805. if (n_barre == -1000) {return;}
  4806.  
  4807. affi_details_note(midi);
  4808.  
  4809. n2 = test_if_note_in_liste(n_barre, midi); // si note in liste, -> n2 = num de la note
  4810.  
  4811. if (n2 != -1000) { QString s1; s1.setNum(n2); lineEdit_7c->setText(s1); }
  4812.  
  4813. if (write_mode == 1) // WRITE (ajout d'une note)
  4814. {
  4815. n2 = test_if_note_in_liste(n_barre, midi);
  4816. if (n2 == -1000) // si la note ne figure pas déjà dans la liste...
  4817. {
  4818. // enregistre la note dans la liste (à la fin)
  4819. if(mode=='T') {ajout_note(midi, n_barre, 0);}
  4820. if(mode=='M') {ajout_note(midi, 0, n_barre);}
  4821. }
  4822. effacer_calque(scene4,calque_notes_manuelles);
  4823. //effacer_calque(scene4,calque_notes_jouee);
  4824. tri_liste_notes_par_num_barre(); // les notes seront triées par num_barre croissant
  4825. numerotation_liste_notes(); // les notes seront numérotées par num_barre croissant
  4826. affiche_liste_notes();
  4827. trace_liste_notes();
  4828. surbrille_note(n2, true, 1);
  4829. }
  4830. }
  4831.  
  4832.  
  4833. void MW::deselect_notes()
  4834. {
  4835. int n_max =liste_NOTES.length();
  4836. for (int n =0; n<n_max; n++)
  4837. {
  4838. liste_NOTES[n].statut &= ~0b00000001;
  4839. }
  4840. effacer_calque(scene4, calque_surbrillance);
  4841.  
  4842. }
  4843.  
  4844.  
  4845. void MW::contextMenuEvent(QContextMenuEvent *event) // menu contextuel (c.a.d déclenché par le clic de droite)
  4846. {
  4847.  
  4848. qDebug() << "clic de droite";
  4849.  
  4850. if (Boite_Onglets_Global->currentIndex() == 2)
  4851. {
  4852. QString s1, s2, s3;
  4853. int x_min, x_max, y_min, y_max;
  4854.  
  4855. x_min = GRW_manche->x();
  4856. x_max = x_min + GRW_manche->width();
  4857. y_min = GRW_manche->y();
  4858. y_max = y_min + GRW_manche->height();
  4859.  
  4860. //x_clic_ecran = event->position().x(); // écriture incompatible pour le clic de gauche...
  4861. //y_clic_ecran = event->position().y();
  4862.  
  4863. int x_clic_global = event->globalX();
  4864. int y_clic_global = event->globalY();
  4865.  
  4866. int x_clic_manche = x_clic_global;
  4867. int y_clic_manche = y_clic_global-25;
  4868.  
  4869.  
  4870. if (x_clic_manche > x_min && x_clic_manche < x_max && y_clic_manche > y_min && y_clic_manche < y_max)
  4871. {
  4872. // suite à un clic sur le manche :
  4873. detecte_note_xy(x_clic_manche, y_clic_manche, &corde_jouee, &case_jouee); // actualise les variables globales
  4874.  
  4875. s1.setNum(case_jouee); lineEdit_case_i->setText(s1);
  4876. s1.setNum(corde_jouee); lineEdit_corde_i->setText(s1);
  4877. }
  4878.  
  4879. if (corde_jouee>0)
  4880. {
  4881. case_min = 0;
  4882. case_max = 20;
  4883. // checkBox_not_erase->setChecked(false);
  4884.  
  4885. if (!checkBox_not_erase->isChecked()) {on_Bt_RAZ_clicked();}
  4886.  
  4887. s2.setNum(corde_jouee);
  4888. LBL_corde->setText("corde " + s2);
  4889. s3.setNum(case_jouee);
  4890. LBL_case->setText("case " + s3);
  4891.  
  4892. n_midi_jouee = calcul_midi(corde_jouee, case_jouee);
  4893.  
  4894. //affiche_details_note(n_midi_jouee);
  4895.  
  4896. execute_note_midi(n_midi_jouee);
  4897. }
  4898.  
  4899. int h = calcul_hauteur_note(n_midi_jouee);
  4900. //qDebug() << "h" << h;
  4901.  
  4902. QColor c1 = liste_couleurs[h];
  4903. s1.setNum(n_midi_jouee);
  4904.  
  4905. s2 = "mode: DEPOT NOTE (m"+ s1 + ")\n";
  4906. s2 += "clic dans une case de TW3 pour placer la note -->";
  4907. label_MESSAGE->setText(s2);
  4908.  
  4909.  
  4910. label_MESSAGE->setVisible(true);
  4911. set_couleur_label(c1, label_MESSAGE);
  4912.  
  4913. mode_depot_note = true;
  4914. MW::setCursor(Qt::CrossCursor);
  4915. }
  4916. }
  4917.  
  4918.  
  4919.  
  4920. void MW::detecte_note_xy(int x_i, int y_i, int *corde_i, int *case_i)
  4921. {
  4922. // suite à un clic directement sur le manche
  4923. // voir la fonction "mousePressEvent()"
  4924. float y;
  4925. float dy;
  4926. float y0;
  4927. float ech;
  4928.  
  4929. // détection du numéro de la case jouée
  4930. *case_i=-1;
  4931. for (int i=0; i<21; i++)
  4932. {
  4933. int x= positionsX[i] +30;
  4934. if ((abs(x_i - x))<30) {*case_i = i;}
  4935. }
  4936. if (*case_i == -1)
  4937. {
  4938. *corde_i=0;
  4939. *case_i=0;
  4940. return;
  4941. }
  4942.  
  4943. // détection du numéro de la corde jouée
  4944. *corde_i=0;
  4945. y0=270; //250
  4946.  
  4947. for (int i=1; i<=6; i++)
  4948. {
  4949. ech=1+ *case_i/90.0;
  4950. dy=-20.0*((7-i)-3.2);
  4951. dy *= ech;
  4952. y=y0+dy;
  4953.  
  4954. if ((abs(y_i - y))<20) {*corde_i = i;}
  4955. }
  4956. }
  4957.  
  4958.  
  4959. void MW::execute_note_midi(uint midi)
  4960. {
  4961. calcul_hauteur_note(midi);
  4962. if (CB_dess1seuleNote->isChecked()) {on_Bt_RAZ_clicked();} // efface tout avant de ne dessiner qu'une seule note
  4963. //QString s1;
  4964. //s1.setNum(i);
  4965. //lineEdit_7->setText(s1);
  4966. num_note_jouee++;
  4967. switch(midi)
  4968. {
  4969. case 40: on_Bt_E3_clicked(); break; // mi
  4970. case 41: on_Bt_F3_clicked(); break; // fa
  4971. case 42: on_Bt_Fd3_clicked(); break; // fa#
  4972. case 43: on_Bt_G3_clicked(); break; //sol
  4973. case 44: on_Bt_Gd3_clicked(); break; //sol#
  4974. case 45: on_Bt_A3_clicked(); break; //la
  4975. case 46: on_Bt_Bb3_clicked(); break; //sib
  4976. case 47: on_BT_B3_clicked(); break; //si
  4977. case 48: on_Bt_C4_clicked(); break; //do
  4978. case 49: on_Bt_Cd4_clicked(); break; //do#
  4979. case 50: on_Bt_D4_clicked(); break; //re
  4980. case 51: on_Bt_Eb4_clicked(); break; //mib
  4981. case 52: on_Bt_E4_clicked(); break; //mi
  4982. case 53: on_Bt_F4_clicked(); break; //fa
  4983. case 54: on_Bt_Fd4_clicked(); break; //fa#
  4984. case 55: on_Bt_G4_clicked(); break; //sol
  4985. case 56: on_Bt_Gd4_clicked(); break; //sol#
  4986. case 57: on_Bt_A4_clicked(); break; //la
  4987. case 58: on_Bt_Bb4_clicked(); break; //sib
  4988. case 59: on_Bt_B4_clicked(); break; //si
  4989. case 60: on_Bt_C5_clicked(); break; //do
  4990. case 61: on_Bt_Cd5_clicked(); break; //do#
  4991. case 62: on_Bt_D5_clicked(); break; //re
  4992. case 63: on_Bt_Eb5_clicked(); break; //mib
  4993. case 64: on_Bt_E5_clicked(); break; //mi
  4994. case 65: on_Bt_F5_clicked(); break; //fa
  4995. case 66: on_Bt_Fd5_clicked(); break; //fa#
  4996. case 67: on_Bt_G5_clicked(); break; //sol
  4997. case 68: on_Bt_Gd5_clicked(); break; //sol#
  4998. case 69: on_Bt_A5_clicked(); break; //la
  4999. case 70: on_Bt_Bb5_clicked(); break; //sib
  5000. case 71: on_Bt_B5_clicked(); break; //si
  5001. case 72: on_Bt_C6_clicked(); break; //do
  5002. case 73: on_Bt_Cd6_clicked(); break; //do#
  5003. case 74: on_Bt_D6_clicked(); break; //re
  5004. case 75: on_Bt_Eb6_clicked(); break; //mib
  5005. case 76: on_Bt_E6_clicked(); break; //mi
  5006. case 77: on_Bt_F6_clicked(); break; //fa
  5007. case 78: on_Bt_Fd6_clicked(); break; //fa#
  5008. case 79: on_Bt_G6_clicked(); break; //sol
  5009. case 80: on_Bt_Gd6_clicked(); break; //sol#
  5010. case 81: on_Bt_A6_clicked(); break; //la
  5011. case 82: on_Bt_Bb6_clicked(); break; //sib
  5012. case 83: on_Bt_B6_clicked(); break; //si
  5013. case 84: on_Bt_C7_clicked(); break; //do
  5014.  
  5015. default: { ; } break;
  5016. }
  5017. }
  5018.  
  5019.  
  5020.  
  5021. void MW::mousePressEvent(QMouseEvent *event) // code provenant du prog 'guitare'
  5022. {
  5023. if(event->button() == Qt::RightButton) {return;}
  5024.  
  5025. // qDebug() << "clic de gauche";
  5026.  
  5027. //================================================================================================================
  5028. if (Boite_Onglets_Global->currentIndex() == 1)
  5029. {
  5030. QString s1;
  5031. //double x0, y0; // position cliquée
  5032.  
  5033. int n_barre=0; // numero de la barre verticale de la grille temporelle (depuis le départ)
  5034. int n2=0;
  5035.  
  5036. //double x_barre=0;
  5037. double x_min, x_max;
  5038. double y_min, y_max;
  5039.  
  5040. int midi=0; // midi
  5041. int dm =0;
  5042.  
  5043. double scroll_x = GV_grillesTM->horizontalScrollBar()->value();
  5044. double scroll_y = GV_grillesTM->verticalScrollBar()->value();
  5045.  
  5046. GV_grillesTM->verticalScrollBar()->setValue(0);
  5047.  
  5048. //if (checkBox_sel_boite->isChecked()) { deselect_notes();}
  5049. effacer_calque(scene4, calque_surbrillance);
  5050.  
  5051. s1.setNum(scroll_x); lineEdit_8->setText(s1);
  5052. s1.setNum(scroll_y); lineEdit_9->setText(s1);
  5053.  
  5054. x_min = GV_grillesTM->x();
  5055. x_max = x_min + GV_grillesTM->width();
  5056.  
  5057. y_min = GV_grillesTM->y()+50;
  5058. y_max = y_min + GV_grillesTM->height() + 32; // +32 sinon rate le mi grave (midi 40)
  5059.  
  5060. x_clic_ecran = event->position().x(); // variable globale
  5061. y_clic_ecran = event->position().y();
  5062.  
  5063. x_clic_GRV4 = x_clic_ecran-2 + scroll_x; // position cliquée // variable globale
  5064. y_clic_GRV4 = y_clic_ecran-78 + scroll_y; // 78
  5065.  
  5066.  
  5067. // ---------------------- si clic sur la surface de graphicsView4 ----------------------------------------
  5068. if (x_clic_ecran > x_min && x_clic_ecran < x_max && y_clic_ecran > y_min && y_clic_ecran < y_max)
  5069. {
  5070. s1.setNum(x_clic_GRV4); lineEdit_4->setText(s1);
  5071. s1.setNum(y_clic_GRV4); lineEdit_5->setText(s1); // =481 foire !
  5072.  
  5073. dm = recherche_note(y_clic_GRV4);
  5074. if (dm != -1)
  5075. {
  5076. // calcul de la valeur midi de la note
  5077. midi = 28 + dm; // ok
  5078. // qDebug() << "midi" << midi;
  5079.  
  5080. encadre_midi(midi);
  5081.  
  5082. //qDebug() << "x_clic_GRV4" << x_clic_GRV4;
  5083. n_barre = calcul_num_barre(x_clic_GRV4);
  5084.  
  5085. num_barre_saisie = n_barre;
  5086. spinBox_num_barre->setValue(num_barre_saisie);
  5087. surbrille_barre(num_barre_saisie, "#00FF00"); // ligne verticale VERTE
  5088.  
  5089. //if (n_barre == -1000) {return;}
  5090. affi_details_note(midi);
  5091. n2 = test_if_note_in_liste(n_barre, midi); // si note in liste, -> n2 = num de la note
  5092. if (n2 != -1000) { QString s1; s1.setNum(n2); lineEdit_7c->setText(s1); }
  5093.  
  5094. if (write_mode == 3) // SELECT
  5095. {
  5096. n2 = test_if_note_in_liste(n_barre, midi);
  5097. if (n2 != -1000) // si la note figure dans la liste...
  5098. {
  5099. effacer_calque(scene4, calque_notes_jouee);
  5100. num_note_cliquee = n2;
  5101. //liste_NOTES[n2].statut |= 0b00000001;
  5102. }
  5103. }
  5104.  
  5105. if ((write_mode < 5) && (! checkBox_sel_boite->isChecked()))
  5106. {
  5107. play_note(midi);
  5108. }
  5109.  
  5110. //effacer_calque(scene4, calque_surbrillance);
  5111. // encadre_midi(midi);
  5112. // surbrille_note(n2, true);
  5113.  
  5114. if (write_mode == 2) // EFFACE une note puis quitte ce mode
  5115. {
  5116. n2 = test_if_note_in_liste(n_barre, midi);
  5117. if (n2 != -1000) // si la note figure dans la liste...
  5118. {
  5119. supprime_note(n2);
  5120. on_Bt_mode_R_clicked(); // repasse en mode LECTURE pour éviter d'effacer d'autres notes par erreur
  5121. }
  5122. }
  5123.  
  5124. if (write_mode == 4) // EFFACE plusieurs notes (c.à.d ne quitte pas le mode)
  5125. {
  5126. if (checkBox_sel_boite->isChecked())
  5127. {
  5128. int n_max = liste_NOTES.length();
  5129. for(int n=0; n<n_max; n++)
  5130. {
  5131. if ((liste_NOTES[n].statut & 0b00000001) == 0b00000001) {supprime_note(n);}
  5132. }
  5133.  
  5134. }
  5135.  
  5136. n2 = test_if_note_in_liste(n_barre, midi);
  5137. if (n2 != -1000) // si la note figure dans la liste...
  5138. {
  5139. supprime_note(n2);
  5140. }
  5141.  
  5142. }
  5143.  
  5144. if (write_mode == 5) // COPIER groupe de notes
  5145. {
  5146. n_barre_copie = n_barre;
  5147. MW::setCursor(Qt::PointingHandCursor);
  5148. encadre_groupe_notes(n_barre_copie, spinBox_nb_copie->value());
  5149. //surbrille_barre(n_barre_copie);
  5150. write_mode = 6;
  5151. }
  5152. else if (write_mode == 6) // COLLER groupe de notes
  5153. {
  5154. duplique_notes(n_barre_copie, n_barre, spinBox_nb_copie->value());
  5155. write_mode = 0;
  5156. effacer_calque(scene4, calque_surbrillance);
  5157. encadre_groupe_notes(n_barre, spinBox_nb_copie->value());
  5158. MW::setCursor(Qt::ArrowCursor);
  5159. }
  5160. }
  5161. else
  5162. {
  5163. ;
  5164. //deselect_notes();
  5165. //write_mode =0;
  5166. }
  5167. }
  5168.  
  5169. //int h1 = calcul_hauteur_note(midi);
  5170. //QColor couleur1 = liste_couleurs[h1];
  5171.  
  5172. effacer_calque(scene4,calque_notes_manuelles);
  5173. //effacer_calque(scene4,calque_notes_jouee);
  5174. tri_liste_notes_par_num_barre(); // les notes seront triées par num_barre croissant
  5175. numerotation_liste_notes(); // les notes seront numérotées par num_barre croissant
  5176. affiche_liste_notes();
  5177. trace_liste_notes();
  5178.  
  5179. int octave = (midi-36) /12; // (midi-36) /12;
  5180. int hauteur = calcul_hauteur_note(midi);
  5181.  
  5182. spinBox_octave->setValue(octave);
  5183. spinBox_hauteur->setValue(hauteur);
  5184.  
  5185. spinBox_num_note->setValue(num_note_cliquee);
  5186. spinBox_10->setValue(num_note_cliquee); // 'debut'
  5187.  
  5188. surbrille_note(n2, true, 1);
  5189. encadre_midi(midi);
  5190.  
  5191.  
  5192. if (0) // 1 pour test (affiche une petite croix à la position cliquée)
  5193. {
  5194. int d=10; // taille
  5195. QPen pen1; pen1.setColor("#FFFF00");
  5196. ligne1 = new QGraphicsLineItem(x_clic_GRV4-d, y_clic_GRV4-d, x_clic_GRV4+d, y_clic_GRV4+d);
  5197. ligne1->setPen(pen1);
  5198. calque_notes_manuelles->addToGroup(ligne1);
  5199. ligne1 = new QGraphicsLineItem(x_clic_GRV4-d, y_clic_GRV4+d, x_clic_GRV4+d, y_clic_GRV4-d);
  5200. ligne1->setPen(pen1);
  5201. calque_notes_manuelles->addToGroup(ligne1);
  5202. }
  5203. }
  5204.  
  5205. //=================================== POUR L'ONGLET 2 'INSTRUMENTS' =====================================================
  5206. if (Boite_Onglets_Global->currentIndex() == 2)
  5207. {
  5208. QString s1, s2, s3;
  5209. int x_min, x_max, y_min, y_max;
  5210.  
  5211. effacer_calque(scene4, calque_rect_select);
  5212.  
  5213. x_min = GRW_manche->x();
  5214. x_max = x_min + GRW_manche->width();
  5215. y_min = GRW_manche->y();
  5216. y_max = y_min + GRW_manche->height()+30;
  5217.  
  5218. x_clic_ecran = event->position().x();
  5219. y_clic_ecran = event->position().y();
  5220.  
  5221. if (x_clic_ecran > x_min && x_clic_ecran < x_max && y_clic_ecran > y_min && y_clic_ecran < y_max)
  5222. {
  5223. // suite à un clic sur le manche :
  5224. detecte_note_xy(x_clic_ecran, y_clic_ecran, &corde_jouee, &case_jouee); // actualise les variables globales
  5225.  
  5226. s1.setNum(case_jouee); lineEdit_case_i->setText(s1);
  5227. s1.setNum(corde_jouee); lineEdit_corde_i->setText(s1);
  5228.  
  5229. if (corde_jouee>=0)
  5230. {
  5231. case_min = 0;
  5232. case_max = 20;
  5233. // checkBox_not_erase->setChecked(false);
  5234.  
  5235. if (!checkBox_not_erase->isChecked()) {on_Bt_RAZ_clicked();}
  5236.  
  5237. s2.setNum(corde_jouee);
  5238. LBL_corde->setText("corde " + s2);
  5239. s3.setNum(case_jouee);
  5240. LBL_case->setText("case " + s3);
  5241.  
  5242. n_midi_jouee = calcul_midi(corde_jouee, case_jouee);
  5243.  
  5244. //affiche_details_note(n_midi_jouee);
  5245.  
  5246. calcul_hauteur_note(n_midi_jouee);
  5247. execute_note_midi(n_midi_jouee);
  5248. }
  5249. }
  5250. else
  5251. {
  5252. mode_depot_note = false;
  5253. label_MESSAGE->setVisible(false);
  5254. MW::setCursor(Qt::ArrowCursor);
  5255. }
  5256. /*
  5257.   if (0) // 1 pour test (affiche une petite croix à la position cliquée)
  5258.   {
  5259.   int d=30; // taille
  5260.   QPen pen1; pen1.setColor("#FFFF00");
  5261.   ligne1 = new QGraphicsLineItem(x_clic_ecran-d, y_clic_ecran-d, x_clic_ecran+d, y_clic_ecran+d);
  5262.   ligne1->setPen(pen1);
  5263.   calque_notes_manche->addToGroup(ligne1);
  5264.   ligne1 = new QGraphicsLineItem(x_clic_ecran-d, y_clic_ecran+d, x_clic_ecran+d, y_clic_ecran-d);
  5265.   ligne1->setPen(pen1);
  5266.   calque_notes_manche->addToGroup(ligne1);
  5267.   }
  5268. */
  5269. }
  5270. }
  5271.  
  5272.  
  5273.  
  5274. int MW::joue_1_note_de_la_liste()
  5275. {
  5276. NOTE note_i1, note_i2;
  5277. int midi_i;
  5278. int barre1=0;
  5279. int barre2=0;
  5280. int d_barre;
  5281. QString s1;
  5282.  
  5283. QDateTime tpi;
  5284. tpi = QDateTime::currentDateTime();
  5285. qint64 tp_relatif = temps_0.msecsTo(tpi); // en ms
  5286. s1.setNum(tp_relatif);
  5287.  
  5288. uint16_t num_max = liste_NOTES.length();
  5289. if (num_max == 0) {return 0;}
  5290. if (num_max < 3) {return 0;}
  5291.  
  5292.  
  5293. if (num_note_jouee >= num_max)
  5294. {
  5295. // fin du morceau !
  5296. lecture_en_cours = false;
  5297. Timer2->stop();
  5298. Bt_jouer_tout->setText(">");
  5299. return 0;
  5300. }
  5301. note_i1 = liste_NOTES[num_note_jouee];
  5302.  
  5303. if(num_note_jouee < num_max)
  5304. {
  5305. note_i2 = liste_NOTES[num_note_jouee+1];
  5306. }
  5307. else
  5308. {
  5309. note_i2 = liste_NOTES[num_note_jouee];
  5310. }
  5311.  
  5312.  
  5313. midi_i = note_i1.midi;
  5314.  
  5315. if(mode == 'T')
  5316. {
  5317. barre1 = note_i1.n_barreT;
  5318. barre2 = note_i2.n_barreT;
  5319. }
  5320. if(mode == 'M')
  5321. {
  5322. barre1 = note_i1.n_barreM;
  5323. barre2 = note_i2.n_barreM;
  5324. }
  5325.  
  5326. d_barre = barre2 - barre1;
  5327. if (d_barre < 0){d_barre = -d_barre;}
  5328.  
  5329. if ((barre1 == barre2) && (num_note_jouee < num_max-2))// detection d'un accord (notes simultanées)
  5330. {
  5331. // surbrille_note(num_note_jouee, false);
  5332. // surbrille_note(num_note_jouee+1, false);
  5333. nb_acc++;
  5334. }
  5335. else
  5336. {
  5337. if (nb_acc == 0) {effacer_calque(scene4, calque_notes_jouee);}
  5338. surbrille_note(num_note_jouee, false, 1);
  5339. surbrille_barre(barre1, "#FFFFFF");
  5340. if (midi_i >45) // on laisse résonner les basses
  5341. {
  5342. //player1->stop();
  5343. //player2->stop();
  5344. //player3->stop();
  5345. }
  5346. nb_acc--; if (nb_acc<0) {nb_acc=0;}
  5347. }
  5348.  
  5349. s1.setNum(num_note_jouee); lineEdit_7c->setText(s1);
  5350. lineEdit_7->setText("");
  5351. lineEdit_7b->setText("");
  5352.  
  5353. s1.setNum(midi_i) ;
  5354.  
  5355. if(num_note_jouee == num_max) {d_barre = 2;}
  5356.  
  5357. if ( ! (checkBox_basses->isChecked() && midi_i > spinBox_filtre_2->value() ))
  5358. {
  5359. play_note(midi_i);
  5360. // encadre_midi(midi_i);
  5361. }
  5362.  
  5363. num_note_jouee++;
  5364. if(num_note_jouee > num_note_max)
  5365. {
  5366. Timer2->stop();
  5367. effacer_calque(scene4, calque_notes_jouee);
  5368. //num_note_jouee=0;
  5369. }
  5370.  
  5371. return d_barre; // permet de retrouver l'espacement temporel entre la note et celle qui suit.
  5372. }
  5373.  
  5374.  
  5375.  
  5376.  
  5377. void MW::on_Bt_toggle_grille_T_clicked()
  5378. {
  5379. Bt_toggle_grille_T->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(0, 255, 0);"); // vert
  5380. Bt_toggle_grille_M->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(200, 200, 200);");
  5381.  
  5382. mode = 'T';
  5383. mode_grille_T();
  5384.  
  5385. // tri_liste_notes_par_num_barre(); //les notes seront triées par temps croissant
  5386. // numerotation_liste_notes(); //les notes seront numérotées par temps croissant
  5387. // affiche_liste_notes();
  5388. trace_liste_notes();
  5389. //effacer_calque(scene4, calque_echelle_temporelle_T);
  5390.  
  5391. }
  5392.  
  5393.  
  5394. void MW::on_Bt_toggle_visu_notes_clicked()
  5395. {
  5396. if(visu_notes == true)
  5397. {
  5398. visu_notes = false;
  5399. Bt_toggle_visu_notes->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(200, 200, 200);");
  5400. effacer_calque(scene4, calque_notes_manuelles);
  5401. }
  5402. else
  5403. {
  5404. visu_notes = true;
  5405. Bt_toggle_visu_notes->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(0, 255, 0);"); // vert
  5406. trace_liste_notes();
  5407. }
  5408. }
  5409.  
  5410.  
  5411.  
  5412.  
  5413. void MW::on_Bt_toggle_grille_M_clicked()
  5414. {
  5415. Bt_toggle_grille_M->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(0, 255, 0);"); // vert
  5416. Bt_toggle_grille_T->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(200, 200, 200);");
  5417.  
  5418. mode = 'M';
  5419. mode_grille_M();
  5420.  
  5421. //tri_liste_notes_par_num_barre(); //les notes seront triées par temps croissant
  5422. // numerotation_liste_notes(); //les notes seront numérotées par temps croissant
  5423. // affiche_liste_notes();
  5424. trace_liste_notes();
  5425. }
  5426.  
  5427.  
  5428.  
  5429.  
  5430.  
  5431. void MW::mode_grille_T()
  5432. {
  5433. effacer_calque(scene4, calque_grille_T);
  5434. effacer_calque(scene4, calque_grille_M);
  5435. effacer_calque(scene4, calque_echelle_temporelle_T);
  5436. effacer_calque(scene4, calque_echelle_temporelle_M);
  5437.  
  5438. frame_7->setVisible(true);
  5439. frame_10->setVisible(false);
  5440. Bt_copie_notes->setVisible(false);
  5441. Bt_12->setVisible(false);
  5442. //spinBox_dxa->setVisible(false);
  5443. doubleSpinBox_dxb->setVisible(false);
  5444. spinBox_x0a->setVisible(false);
  5445. doubleSpinBox_x0b->setVisible(false);
  5446.  
  5447. Bt_decale_notes_L->setVisible(true);
  5448. Bt_decale_notes_R->setVisible(true);
  5449. Bt_durees_div2->setVisible(true);
  5450. Bt_durees_mult2->setVisible(true);
  5451.  
  5452. tracer_grille_T();
  5453. }
  5454.  
  5455.  
  5456.  
  5457. void MW::mode_grille_M()
  5458. {
  5459. effacer_calque(scene4, calque_grille_T);
  5460. effacer_calque(scene4, calque_grille_M);
  5461. effacer_calque(scene4, calque_echelle_temporelle_T);
  5462. effacer_calque(scene4, calque_echelle_temporelle_M);
  5463.  
  5464. frame_7->setVisible(false);
  5465. frame_10->setVisible(true);
  5466. Bt_copie_notes->setVisible(true);
  5467. Bt_12->setVisible(true);
  5468.  
  5469. //spinBox_dxa->setVisible(true);
  5470. doubleSpinBox_dxb->setVisible(true);
  5471. spinBox_x0a->setVisible(true);
  5472. doubleSpinBox_x0b->setVisible(true);
  5473.  
  5474. Bt_decale_notes_L->setVisible(false);
  5475. Bt_decale_notes_R->setVisible(false);
  5476. Bt_durees_div2->setVisible(false);
  5477. Bt_durees_mult2->setVisible(false);
  5478.  
  5479. tracer_grille_M();
  5480. }
  5481.  
  5482.  
  5483.  
  5484. void MW::on_Bt_save_notes_clicked()
  5485. {
  5486. int r1, r2;
  5487.  
  5488. QDate date_systeme = QDate::currentDate();
  5489. QTime heure_systeme = QTime::currentTime();
  5490.  
  5491. QString date1 = date_systeme.toString("yyyyMMdd");
  5492. QString heure1 = heure_systeme.toString();
  5493. QString date_out = date1 + "_" + heure1;
  5494.  
  5495. r1 = save_fichier_NOTES(date_out);
  5496. r2 = save_fichier_FRQ(date_out);
  5497.  
  5498. if ((r1 + r2) != 2) // si = 2 -> aucun fichier enregistré, alors on n'affiche pas le message
  5499. {
  5500. QMessageBox msgBox;
  5501. QString s1="Fichiers enregistrés dans : \n" + string_currentDir + "/";
  5502. msgBox.setText(s1); msgBox.exec();
  5503. }
  5504. }
  5505.  
  5506.  
  5507.  
  5508. void MW::on_Bt_load_notes_clicked()
  5509. {
  5510. uint16_t n_max = liste_NOTES.length();
  5511.  
  5512. if (n_max != 0) // pour éviter d'enregistrer un fichier vide lors du 1er chargement des notes
  5513. {
  5514. QMessageBox msgBox;
  5515.  
  5516. msgBox.setText("Confirmation de chargement");
  5517. msgBox.setInformativeText("Un enregistrement des notes va être effectué au préalable.\n \n"
  5518. "Si clic sur No, les notes actuelles seront perdues.\n \n"
  5519. "Si clic sur Cancel, opération annulée");
  5520.  
  5521. msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Ok | QMessageBox::Cancel);
  5522. msgBox.setDefaultButton(QMessageBox::Cancel);
  5523. int ret = msgBox.exec();
  5524. if (ret == QMessageBox::Cancel ) { return; }
  5525. if (ret == QMessageBox::Ok ) { on_Bt_save_notes_clicked(); }
  5526. }
  5527.  
  5528.  
  5529. liste_NOTES.clear();
  5530. effacer_calque(scene4,calque_notes_manuelles);
  5531. effacer_calque(scene4,calque_notes_auto);
  5532. effacer_calque(scene4,calque_notes_jouee);
  5533. effacer_calque(scene5, calque_histogramme );
  5534. effacer_calque(scene4, calque_echelle_temporelle_T);
  5535. effacer_calque(scene4, calque_echelle_temporelle_M);
  5536.  
  5537. load_fichier_NOTES("");
  5538.  
  5539. suppression_notes_invalides();
  5540. tri_liste_notes_par_num_barre(); //les notes seront triées par temps croissant
  5541. numerotation_liste_notes();
  5542.  
  5543. calcul_histogramme_durees();
  5544. affiche_histogramme_durees();
  5545. on_Bt_toggle_grille_M_clicked();
  5546. }
  5547.  
  5548.  
  5549. void MW::on_Bt_joue_passage_clicked()
  5550. {
  5551. if (liste_NOTES.length() == 0) {return;}
  5552.  
  5553. if (lecture_en_cours == true)
  5554. {
  5555. Timer2->stop();
  5556. Bt_joue_passage->setText(">");
  5557. Timer2->setInterval(0);
  5558. lecture_en_cours = false;
  5559. }
  5560. else
  5561. {
  5562. Bt_joue_passage->setText("[]");
  5563.  
  5564. Timer2->start(500);
  5565.  
  5566. int note_de_depart = spinBox_10->value();
  5567. int nb_notes_a_jouer = spinBox_11->value()-1;
  5568.  
  5569. num_note_jouee = note_de_depart;
  5570. num_note_max = note_de_depart + nb_notes_a_jouer;
  5571. if (num_note_max > liste_NOTES.length()-1) { num_note_max = liste_NOTES.length()-1;}
  5572.  
  5573. // NOTE note_i = liste_NOTES[note_de_depart];
  5574. //double x_note = 80 + note_i.n_barreT * spinBox_dxa->value()/2.0 * zoom_x;
  5575. // graphicsView4->horizontalScrollBar()->setValue(x_note - 100);
  5576.  
  5577. Timer2->start(500);
  5578. lecture_en_cours = true;
  5579. }
  5580.  
  5581. }
  5582.  
  5583.  
  5584. void MW::on_Bt_joue_wav_clicked()
  5585. {
  5586. QStringList arguments;
  5587. arguments << string_currentFile;
  5588. QString program = "audacity"; //"audacious"
  5589. QProcess *myProcess = new QProcess();
  5590. myProcess->start(program, arguments);
  5591. }
  5592.  
  5593.  
  5594.  
  5595. void MW::on_Bt_joue_wav_2_clicked()
  5596. {
  5597. on_Bt_joue_wav_clicked();
  5598. }
  5599.  
  5600.  
  5601. void MW::on_Btn_RAZ_notes_clicked()
  5602. {
  5603. QMessageBox msgBox;
  5604. msgBox.setText("Erase notes");
  5605. msgBox.setInformativeText("Effacer toutes les notes ?");
  5606. msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  5607. msgBox.setDefaultButton(QMessageBox::Cancel);
  5608. int ret = msgBox.exec();
  5609.  
  5610. if (ret == QMessageBox::Ok )
  5611. {
  5612. liste_NOTES.clear();
  5613. num_barre_en_cours=0;
  5614. effacer_calque(scene4, calque_notes_manuelles);
  5615. effacer_calque(scene4, calque_notes_auto);
  5616. affiche_liste_notes();
  5617. effacer_calque(scene4, calque_surbrillance);
  5618. num_barre_saisie=0;
  5619. surbrille_barre(num_barre_saisie, "#00FF00");
  5620. }
  5621. }
  5622.  
  5623.  
  5624. void MW::on_Btn_RAZ_notes_2_clicked()
  5625. {
  5626. QMessageBox msgBox;
  5627. msgBox.setText("Erase certaines notes");
  5628. msgBox.setInformativeText("Effacer des notes ?");
  5629. msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
  5630. msgBox.setDefaultButton(QMessageBox::Cancel);
  5631. int ret = msgBox.exec();
  5632.  
  5633. if (ret == QMessageBox::Ok )
  5634. {
  5635. int n = spinBox_n_raz->value();
  5636. //int n_max = liste_NOTES.length();
  5637.  
  5638. int n_max = liste_NOTES.length();
  5639. if (n<n_max)
  5640. {
  5641. liste_NOTES.remove(n, n_max-n);
  5642. }
  5643.  
  5644. int n_max2 = liste_ENR_FFT.length();
  5645. int n2= 300*n;
  5646. if (n2<n_max2)
  5647. {
  5648. liste_ENR_FFT.remove(n2, n_max2-n2);
  5649. }
  5650.  
  5651. effacer_calque(scene4, calque_notes_manuelles);
  5652. trace_liste_notes();
  5653.  
  5654. effacer_calque(scene4, calque_TAB_FRQ);
  5655. retracer_TAB_FRQ();
  5656.  
  5657. //effacer_calque(scene4,calque_notes_manuelles);
  5658. //effacer_calque(scene4, calque_notes_auto);
  5659. //affiche_liste_notes();
  5660. }
  5661. }
  5662.  
  5663.  
  5664.  
  5665. void MW::on_spinBox_8_textChanged()
  5666. {
  5667. effacer_calque(scene4, calque_echelle_temporelle_T);
  5668. effacer_calque(scene4, calque_echelle_temporelle_M);
  5669. tracer_echelle_temps_TAB_NOTES();
  5670. }
  5671.  
  5672.  
  5673. void MW::on_doubleSpinBox_x0_valueChanged(double arg1)
  5674. {
  5675.  
  5676. //double pas_grille = spinBox_dt->value()/2.0 * zoom_x;
  5677. //double offset_x = 10 * arg1 + spinBox_d_barres->value() * pas_grille;
  5678. // calque_TAB_FRQ->setPos(offset_x, 0);
  5679. // calque_notes_auto->setPos(offset_x, 0);
  5680.  
  5681. effacer_calque(scene4, calque_grille_M);
  5682. tracer_grille_M();
  5683. // effacer_calque(scene4, calque_notes_manuelles);
  5684. // affiche_liste_notes();
  5685. // trace_liste_notes();
  5686. // effacer_calque(scene4, calque_echelle_temporelle_T);
  5687. // tracer_echelle_temps_TAB_NOTES();
  5688. }
  5689.  
  5690.  
  5691. void MW::on_spinBox_dxa_valueChanged(int arg1)
  5692. {
  5693.  
  5694. //doubleSpinBox_dxb->setValue(0);
  5695. effacer_calque(scene4, calque_echelle_temporelle_T);
  5696. effacer_calque(scene4, calque_grille_M);
  5697. tracer_grille_M();
  5698. effacer_calque(scene4, calque_notes_manuelles);
  5699. affiche_liste_notes();
  5700. //trace_liste_notes();
  5701.  
  5702. tracer_echelle_temps_TAB_NOTES();
  5703. if (visu_notes == true) {trace_liste_notes();}
  5704.  
  5705. // on_Bt_copy_nt_T_to_M_clicked();
  5706. }
  5707.  
  5708.  
  5709. void MW::on_doubleSpinBox_dxb_valueChanged(double arg1)
  5710. {
  5711. effacer_calque(scene4, calque_grille_M);
  5712. effacer_calque(scene4, calque_echelle_temporelle_T);
  5713. effacer_calque(scene4, calque_echelle_temporelle_M);
  5714. effacer_calque(scene4, calque_notes_manuelles);
  5715.  
  5716. on_Bt_copy_nt_T_to_M_clicked();
  5717.  
  5718. affiche_liste_notes();
  5719. trace_liste_notes();
  5720. tracer_grille_M();
  5721. tracer_echelle_temps_TAB_NOTES();
  5722.  
  5723. //if (visu_notes == true) {trace_liste_notes();}
  5724.  
  5725. // on_Bt_copy_nt_T_to_M_clicked();
  5726.  
  5727. }
  5728.  
  5729.  
  5730. void MW::on_Bt_mode_R_clicked() // LECTURE
  5731. {
  5732. write_mode=0;
  5733. //mode_select=false;
  5734. MW::setCursor(Qt::ArrowCursor);
  5735. Bt_mode_R->setStyleSheet("background-color: rgb(0, 255, 0);"); // vert
  5736. Bt_mode_W->setStyleSheet("background-color: rgb(200, 200, 200);");
  5737. Bt_mode_E->setStyleSheet("background-color: rgb(200, 200, 200);");
  5738. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);");
  5739.  
  5740. }
  5741.  
  5742.  
  5743. void MW::on_Bt_mode_W_clicked() // AJOUT
  5744. {
  5745. write_mode=1;
  5746. //mode_select=false;
  5747. //MainWindow::setCursor(Qt::SplitHCursor);
  5748. effacer_calque(scene4, calque_notes_jouee);
  5749. Bt_mode_W->setStyleSheet("background-color: rgb(255, 0, 0);"); // rouge
  5750. Bt_mode_R->setStyleSheet("background-color: rgb(200, 200, 200);");
  5751. Bt_mode_E->setStyleSheet("background-color: rgb(200, 200, 200);");
  5752. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);");
  5753.  
  5754. }
  5755.  
  5756.  
  5757. void MW::on_Bt_mode_E_clicked() // EFFACE 1 note puis quitte ce mode
  5758. {
  5759. write_mode=2;
  5760. //mode_select=false;
  5761. //MainWindow::setCursor(Qt::SplitHCursor);
  5762. Bt_mode_E->setStyleSheet("background-color: rgb(0, 200, 200);"); // cyan
  5763. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);");
  5764. Bt_mode_W->setStyleSheet("background-color: rgb(200, 200, 200);");
  5765. Bt_mode_R->setStyleSheet("background-color: rgb(200, 200, 200);");
  5766.  
  5767. }
  5768.  
  5769.  
  5770.  
  5771. void MW::on_Bt_mode_E_2_clicked() // efface plusieurs notes (c.a.d reste dans ce mode)
  5772. {
  5773. if (write_mode == 4)
  5774. {
  5775. deselect_notes();
  5776. effacer_calque(scene4, calque_rect_select);
  5777.  
  5778. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);"); // gris
  5779. write_mode=0;
  5780. }
  5781.  
  5782. else
  5783. {
  5784. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 0, 0);"); //rouge
  5785. if (checkBox_sel_boite->isChecked())
  5786. {
  5787. int n_max = liste_NOTES.length();
  5788. for(int n=0; n<n_max; n++)
  5789. {
  5790. if (n>=0)
  5791. {
  5792. if ((liste_NOTES[n].statut & 0b00000001) == 0b00000001)
  5793. {
  5794. supprime_note(n);
  5795. if (n>0) {n--;}
  5796. n_max = liste_NOTES.length();
  5797. }
  5798. }
  5799.  
  5800. }
  5801. deselect_notes();
  5802. effacer_calque(scene4, calque_rect_select);
  5803.  
  5804. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);"); // gris
  5805. write_mode=0;
  5806.  
  5807. }
  5808. else
  5809. {
  5810. write_mode=4; // mode effacement plusieur notes une à la fois par clics successifs
  5811. }
  5812.  
  5813. Bt_mode_E->setStyleSheet("background-color: rgb(200, 200, 200);"); // gris
  5814. Bt_mode_W->setStyleSheet("background-color: rgb(200, 200, 200);"); // gris
  5815. Bt_mode_R->setStyleSheet("background-color: rgb(200, 200, 200);"); // gris
  5816.  
  5817. }
  5818.  
  5819. }
  5820.  
  5821.  
  5822.  
  5823. void MW::on_Bt_deplace_L_clicked()
  5824. {
  5825. write_mode=3;
  5826.  
  5827. Bt_mode_E->setStyleSheet("background-color: rgb(200, 200, 200);");
  5828. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);");
  5829. Bt_mode_W->setStyleSheet("background-color: rgb(200, 200, 200);");
  5830. Bt_mode_R->setStyleSheet("background-color: rgb(200, 200, 200);");
  5831.  
  5832. effacer_calque(scene4, calque_notes_manuelles);
  5833. effacer_calque(scene4, calque_notes_jouee);
  5834.  
  5835. int n_max = liste_NOTES.length();
  5836. for(int n=0; n<n_max; n++)
  5837. {
  5838. if ( (liste_NOTES[n].statut & 0b00000001) == 0b00000001) {deplace_note(n, -1, 0);}
  5839. }
  5840.  
  5841. affiche_liste_notes();
  5842. trace_liste_notes();
  5843.  
  5844. write_mode=0;
  5845. surbrille_note(num_note_cliquee, false, 1);
  5846. }
  5847.  
  5848.  
  5849. void MW::on_Bt_deplace_R_clicked()
  5850. {
  5851. write_mode=3;
  5852. Bt_mode_E->setStyleSheet("background-color: rgb(200, 200, 200);");
  5853. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);");
  5854. Bt_mode_W->setStyleSheet("background-color: rgb(200, 200, 200);");
  5855. Bt_mode_R->setStyleSheet("background-color: rgb(200, 200, 200);");
  5856.  
  5857. effacer_calque(scene4, calque_notes_manuelles);
  5858. effacer_calque(scene4, calque_notes_jouee);
  5859.  
  5860. int n_max = liste_NOTES.length();
  5861. for(int n=0; n<n_max; n++)
  5862. {
  5863. if ( (liste_NOTES[n].statut & 0b00000001) == 0b00000001) {deplace_note(n, 1, 0);}
  5864. }
  5865.  
  5866. affiche_liste_notes();
  5867. trace_liste_notes();
  5868.  
  5869. write_mode=0;
  5870. surbrille_note(num_note_cliquee, false, 1);
  5871. }
  5872.  
  5873.  
  5874. void MW::on_Bt_deplace_H_clicked()
  5875. {
  5876. write_mode=3;
  5877. Bt_mode_E->setStyleSheet("background-color: rgb(200, 200, 200);");
  5878. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);");
  5879. Bt_mode_W->setStyleSheet("background-color: rgb(200, 200, 200);");
  5880. Bt_mode_R->setStyleSheet("background-color: rgb(200, 200, 200);");
  5881.  
  5882. effacer_calque(scene4, calque_notes_manuelles);
  5883. effacer_calque(scene4, calque_notes_jouee);
  5884.  
  5885. int n_max = liste_NOTES.length();
  5886. for(int n=0; n<n_max; n++)
  5887. {
  5888. if ( (liste_NOTES[n].statut & 0b00000001) == 0b00000001)
  5889. {
  5890. deplace_note(n, 0, 1);
  5891. }
  5892. }
  5893.  
  5894. affiche_liste_notes();
  5895. trace_liste_notes();
  5896. }
  5897.  
  5898.  
  5899. void MW::on_Bt_deplace_B_clicked()
  5900. {
  5901. write_mode=3;
  5902. Bt_mode_E->setStyleSheet("background-color: rgb(200, 200, 200);");
  5903. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);");
  5904. Bt_mode_W->setStyleSheet("background-color: rgb(200, 200, 200);");
  5905. Bt_mode_R->setStyleSheet("background-color: rgb(200, 200, 200);");
  5906.  
  5907. effacer_calque(scene4, calque_notes_manuelles);
  5908. effacer_calque(scene4, calque_notes_jouee);
  5909.  
  5910. int n_max = liste_NOTES.length();
  5911. for(int n=0; n<n_max; n++)
  5912. {
  5913. if ( (liste_NOTES[n].statut & 0b00000001) == 0b00000001) {deplace_note(n, 0, -1);}
  5914. }
  5915.  
  5916. affiche_liste_notes();
  5917. trace_liste_notes();
  5918. }
  5919.  
  5920.  
  5921.  
  5922. void MW::on_Bt_scan_auto_clicked()
  5923. {
  5924. if (! wav_ok) {return;}
  5925. if ( ! liste_ENR_FFT.isEmpty()) {on_Bt_efface_clicked();}
  5926.  
  5927. on_Bt_toggle_visu_notes_clicked();
  5928.  
  5929. if (rapide)
  5930. {
  5931. if(checkBox_Primaire->isChecked())
  5932. {
  5933. Boite_Onglets_Global->setCurrentIndex(3);
  5934. //effacer_calque(scene_FFTs, calque_points_FFTs);
  5935.  
  5936. }
  5937. else
  5938. {
  5939. Boite_Onglets_Global->setCurrentIndex(1);
  5940. effacer_calque(scene4, calque_TAB_FRQ );
  5941. effacer_calque(scene4, calque_echelle_temporelle_T);
  5942. mode_grille_T();
  5943. }
  5944.  
  5945. on_Bt_RAZ_clicked();
  5946.  
  5947. MW::setCursor(Qt::WaitCursor);
  5948.  
  5949. analyse_tout();
  5950.  
  5951. MW::setCursor(Qt::ArrowCursor);
  5952. }
  5953. else {Timer1->start(10);}
  5954.  
  5955. }
  5956.  
  5957.  
  5958.  
  5959. void MW::on_Bt_jouer_tout_clicked()
  5960. {
  5961. Tic2(); // évite de jouer la 1ere note trop courte... trouvé empiriquement, je n'ai pas pigé pourquoi ????
  5962.  
  5963. if (liste_NOTES.length() == 0) {return;}
  5964.  
  5965. if (lecture_en_cours == true)
  5966. {
  5967. lecture_en_cours = false;
  5968. Timer2->stop();
  5969. Bt_jouer_tout->setText(">");
  5970. }
  5971. else
  5972. {
  5973. Timer2->stop();
  5974. Bt_jouer_tout->setText("[]");
  5975.  
  5976. GV_grillesTM->horizontalScrollBar()->setValue(0);
  5977. calque_noms_notes->setPos(0, 0); // pour décaler également le pavé des noms et le replacer à gauche de l'écran
  5978. memo_scroll_x = 0;
  5979.  
  5980. // Timer2->stop();
  5981. num_barre_en_cours=0;
  5982. num_note_depart = 0;
  5983. num_note_jouee = 0;
  5984. //joue_1_note_de_la_liste();
  5985.  
  5986. num_note_max = liste_NOTES.length();
  5987. if (num_note_max < 1) {return;}
  5988.  
  5989. temps_0 = QDateTime::currentDateTime();
  5990. /*
  5991.   int d_barre = 2;
  5992.   double vts = doubleSpinBox_vitesse->value();
  5993.   double dt = 20.0 * d_barre;
  5994.   dt *= (200.0 / vts);
  5995.   int itrv = (int) dt;
  5996. */
  5997. //Timer2->start(itrv); //voir la fonction 'Tic2()' qui va jouer les notes
  5998. Timer2->start(100); // ce delai est silencieux (pas de note jouée, les notes sont jouées par 'tic2()' )
  5999. lecture_en_cours = true;
  6000. //Timer2->setInterval(itrv);
  6001.  
  6002. }
  6003. }
  6004.  
  6005.  
  6006.  
  6007. void MW::on_Bt_toggle_visu_freq_clicked()
  6008. {
  6009. effacer_calque(scene4, calque_notes_manuelles);
  6010.  
  6011. if(visu_freq == 0)
  6012. {
  6013. visu_freq = 1;
  6014. Bt_toggle_visu_freq->setStyleSheet("background-color: rgb(0, 255, 0);"); // vert
  6015. calque_TAB_FRQ->setVisible(true);
  6016.  
  6017. }
  6018. else
  6019. {
  6020. visu_freq = 0;
  6021. Bt_toggle_visu_freq->setStyleSheet("background-color: rgb(200, 200, 200);");
  6022. calque_TAB_FRQ->setVisible(false);
  6023. on_Bt_toggle_grille_M_clicked();
  6024. }
  6025. }
  6026.  
  6027.  
  6028. void MW::on_Bt_efface_2_clicked() // sur tab FREQ-NOTES
  6029. {
  6030. on_Bt_efface_clicked(); // (celui de l'autre tab FFT)
  6031. }
  6032.  
  6033.  
  6034.  
  6035.  
  6036.  
  6037. void MW::on_doubleSpinBox_t0_valueChanged()
  6038. {
  6039. effacer_calque(scene4, calque_grille_M);
  6040. effacer_calque(scene4, calque_echelle_temporelle_T);
  6041. effacer_calque(scene4, calque_notes_manuelles);
  6042.  
  6043. affiche_liste_notes();
  6044. trace_liste_notes();
  6045.  
  6046. tracer_echelle_temps_TAB_NOTES();
  6047. tracer_grille_M();
  6048. }
  6049.  
  6050.  
  6051.  
  6052. void MW::maj_TAB_NOTES()
  6053. {
  6054. effacer_calque(scene4, calque_grille_M);
  6055. effacer_calque(scene4, calque_notes_manuelles);
  6056. effacer_calque(scene4, calque_notes_auto);
  6057. effacer_calque(scene4, calque_echelle_temporelle_T);
  6058. effacer_calque(scene4, calque_TAB_FRQ);
  6059.  
  6060. retracer_TAB_FRQ();
  6061. trace_liste_notes();
  6062. tracer_echelle_temps_TAB_NOTES();
  6063. tracer_grille_M();
  6064. }
  6065.  
  6066.  
  6067.  
  6068. void MW::on_spinBox_zoom_2_valueChanged(int arg1)
  6069. {
  6070. zoom_x = arg1;
  6071. MW::setCursor(Qt::WaitCursor);
  6072. effacer_calque(scene4, calque_grille_T);
  6073. maj_TAB_NOTES();
  6074. MW::setCursor(Qt::ArrowCursor);
  6075. }
  6076.  
  6077.  
  6078.  
  6079. void MW::on_Bt_9_clicked()
  6080. {
  6081. QMessageBox msgBox;
  6082. QString s1;
  6083. s1 = "Le n° barre est compté depuis le début.";
  6084. s1 += "\n";
  6085. s1 += "La durée des notes n'est (volontairement) pas enregistrée dans les notes ";
  6086. s1 += "ce qui permet de ne PAS affecter l'emplacement de toutes les notes ";
  6087. s1 += "dans la trame temporelle lors de la modification, l'ajout ou la suppression d'une note"; s1 += "\n";
  6088. s1 += "Le tempo et le rythme sont ainsi conservés."; s1 += "\n";
  6089. s1 += "C'est d'ailleurs (me semble-t-il) l'approche retenue dans la norme midi."; s1 += "\n";
  6090.  
  6091. msgBox.setText(s1);
  6092. msgBox.exec();
  6093. }
  6094.  
  6095.  
  6096. void MW::on_spinBox_offset_valueChanged()
  6097. {
  6098. //do_FFT_freq_midi();
  6099. }
  6100.  
  6101.  
  6102.  
  6103. void MW::on_spinBox_d_barres_valueChanged()
  6104. {
  6105. double pas_grille = doubleSpinBox_dxb->value()/2.0 * zoom_x;
  6106. double offset_x = 10 * doubleSpinBox_x0b->value() + spinBox_d_barres->value() * pas_grille;
  6107. calque_TAB_FRQ->setPos(offset_x, 0);
  6108. }
  6109.  
  6110.  
  6111. void MW::on_Bt_decale_notes_L_clicked()
  6112. {
  6113. decale_notes(-1);
  6114. effacer_calque(scene4,calque_notes_manuelles);
  6115. affiche_liste_notes(); // en texte
  6116. trace_liste_notes(); // ellipses
  6117. }
  6118.  
  6119.  
  6120. void MW::on_Bt_decale_notes_R_clicked()
  6121. {
  6122. decale_notes(1);
  6123. effacer_calque(scene4,calque_notes_manuelles);
  6124. affiche_liste_notes(); // en texte
  6125. trace_liste_notes(); // ellipses
  6126. }
  6127.  
  6128.  
  6129.  
  6130. void MW::on_tableWidget_type_M_cellClicked(int row, int column)
  6131. {
  6132. switch (row)
  6133. {
  6134. case 0: {lineEdit_10->setText("2/4"); Ta=2; Tb=4;} break; // Ta et Tb variables globales
  6135. case 1: {lineEdit_10->setText("3/4"); Ta=3; Tb=4;} break;
  6136. case 2: {lineEdit_10->setText("4/4"); Ta=4; Tb=4;} break;
  6137. default: break;
  6138. }
  6139. effacer_calque(scene4, calque_grille_M);
  6140. tracer_grille_M();
  6141. }
  6142.  
  6143.  
  6144.  
  6145. void MW::on_checkBox_flitrer_clicked()
  6146. {
  6147. /*
  6148.   if (checkBox_flitrer->isChecked())
  6149.   {
  6150.   textEdit_ETAT->setText("Mode Filtré : \n Ne sont représentés que les signaux dont l'amplitude est supérieure au seuil choisi");
  6151.   }
  6152.   else
  6153.   {
  6154.   textEdit_ETAT->setText("Mode non-filtré : \n Tous les signaux issus de la FFT sont représentés");
  6155.   }
  6156. */
  6157.  
  6158. MW::setCursor(Qt::WaitCursor);
  6159. maj_TAB_NOTES();
  6160. MW::setCursor(Qt::ArrowCursor);
  6161. }
  6162.  
  6163. /*
  6164. void MW::on_spinBox_filtre_valueChanged()
  6165. {
  6166.   if (checkBox_flitrer->isChecked())
  6167.   {
  6168.   MW::setCursor(Qt::WaitCursor);
  6169.   maj_TAB_NOTES();
  6170.   MW::setCursor(Qt::ArrowCursor);
  6171.   }
  6172. }
  6173. */
  6174. /*
  6175. void MW::on_doubleSpinBox_gain_valueChanged()
  6176. {
  6177.   MW::setCursor(Qt::WaitCursor);
  6178.   effacer_calque(scene4, calque_TAB_FRQ);
  6179.   retracer_TAB_FRQ();
  6180.   MW::setCursor(Qt::ArrowCursor);
  6181. }
  6182. */
  6183.  
  6184. void MW::on_Bt_open_DIR_clicked()
  6185. {
  6186. QString s1, path1;
  6187.  
  6188. path1 = string_currentDir;
  6189.  
  6190. QProcess process1;
  6191. process1.setProgram("caja");
  6192. process1.setArguments({path1});
  6193. process1.startDetached();
  6194. }
  6195.  
  6196.  
  6197.  
  6198. void MW::on_Bt_goto_clicked()
  6199. {
  6200.  
  6201. QString s1;
  6202. int n = lineEdit_7c->text().toInt();
  6203. if ((n<0) || (n>=liste_NOTES.length())) {return;}
  6204.  
  6205. spinBox_10->setValue(n);
  6206. NOTE note_i = liste_NOTES[n];
  6207.  
  6208. //double x_note = 80 + note_i.n_barreT * spinBox_dxa->value()/2.0 * zoom_x;
  6209.  
  6210. num_note_jouee = n;
  6211. surbrille_note(n, false, 1);
  6212.  
  6213. int midi = note_i.midi;
  6214. s1.setNum(midi);
  6215.  
  6216. lineEdit_7->setText(s1);
  6217. affi_txt_en_couleur(midi, lineEdit_7b); // nom de la note
  6218. //affi_txt_en_couleur(midi, lineEdit_7e);
  6219.  
  6220. // graphicsView4->horizontalScrollBar()->setValue(x_note - 200);
  6221.  
  6222. }
  6223.  
  6224.  
  6225. void MW::on_doubleSpinBox_T0_valueChanged(double arg1)
  6226. {
  6227. tracer_echelle_temps_TAB_NOTES();
  6228. }
  6229.  
  6230.  
  6231. void MW::on_Bt_test1_clicked()
  6232. {
  6233. QString s1;
  6234. double valeur;
  6235.  
  6236. for (int n = 0; n <= 255; n+=1)
  6237. {
  6238. valeur = (double )n / 255;
  6239. s1 = calcul_couleur(valeur);
  6240.  
  6241. rectangle1 = new QGraphicsRectItem(n, 200, 2, 5);
  6242. QPen pen1;
  6243. pen1.setColor(s1);
  6244. pen1.setWidth(2);
  6245. rectangle1->setPen(pen1);
  6246. calque_grille_M->addToGroup(rectangle1);
  6247. }
  6248. }
  6249.  
  6250.  
  6251. void MW::on_Bt_durees_div2_clicked()
  6252. {
  6253. uint16_t n_max = liste_NOTES.length();
  6254. if (n_max == 0) {return;}
  6255.  
  6256. NOTE note_i;
  6257. for(int n=0; n<n_max; n++) //n_max
  6258. {
  6259. note_i=liste_NOTES[n];
  6260.  
  6261. int n_barre =note_i.n_barreT;
  6262. n_barre /=2;
  6263. note_i.n_barreT = n_barre;
  6264.  
  6265. liste_NOTES[n] = note_i;
  6266. }
  6267.  
  6268. effacer_calque(scene4,calque_notes_manuelles);
  6269. affiche_liste_notes(); // en texte
  6270. trace_liste_notes(); // ellipses
  6271. }
  6272.  
  6273.  
  6274. void MW::on_Bt_durees_mult2_clicked()
  6275. {
  6276.  
  6277. uint16_t n_max = liste_NOTES.length();
  6278. if (n_max == 0) {return;}
  6279.  
  6280. NOTE note_i;
  6281. for(int n=0; n<n_max; n++) //n_max
  6282. {
  6283. note_i=liste_NOTES[n];
  6284.  
  6285. int n_barre =note_i.n_barreT;
  6286. n_barre *=2;
  6287. note_i.n_barreT = n_barre;
  6288.  
  6289. liste_NOTES[n] = note_i;
  6290. }
  6291.  
  6292. effacer_calque(scene4,calque_notes_manuelles);
  6293. affiche_liste_notes(); // en texte
  6294. trace_liste_notes(); // ellipses
  6295.  
  6296. }
  6297.  
  6298.  
  6299.  
  6300. void MW::on_Bt_div2_clicked()
  6301. {
  6302. gain /=sqrt(2); // en fait / par racine carrée de deux pour plus de finesse
  6303. MW::setCursor(Qt::WaitCursor);
  6304. effacer_calque(scene4, calque_TAB_FRQ);
  6305. retracer_TAB_FRQ();
  6306. MW::setCursor(Qt::ArrowCursor);
  6307. }
  6308.  
  6309.  
  6310. void MW::on_Bt_clicked()
  6311. {
  6312. gain *=sqrt(2);
  6313. MW::setCursor(Qt::WaitCursor);
  6314. effacer_calque(scene4, calque_TAB_FRQ);
  6315. retracer_TAB_FRQ();
  6316. MW::setCursor(Qt::ArrowCursor);
  6317. }
  6318.  
  6319.  
  6320. void MW::on_Bt_next_clicked()
  6321. {
  6322. double scroll_x = GV_grillesTM->horizontalScrollBar()->value();
  6323. GV_grillesTM->horizontalScrollBar()->setValue(scroll_x + 800);
  6324. calque_noms_notes->setPos(scroll_x + 800, 0); // pour décaler également le pavé des noms et le replacer à gauche de l'écran
  6325. }
  6326.  
  6327.  
  6328. void MW::on_Bt_prev_clicked()
  6329. {
  6330. double scroll_x = GV_grillesTM->horizontalScrollBar()->value();
  6331. GV_grillesTM->horizontalScrollBar()->setValue(scroll_x - 800);
  6332. calque_noms_notes->setPos(scroll_x - 800, 0); // pour décaler également le pavé des noms et le replacer à gauche de l'écran
  6333.  
  6334. }
  6335.  
  6336.  
  6337. void MW::on_Bt_debut_clicked()
  6338. {
  6339. GV_grillesTM->horizontalScrollBar()->setValue(0);
  6340. calque_noms_notes->setPos(0, 0); // pour décaler également le pavé des noms et le replacer à gauche de l'écran
  6341.  
  6342. }
  6343.  
  6344.  
  6345. void MW::on_Bt_fin_clicked()
  6346. {
  6347. GV_grillesTM->horizontalScrollBar()->setValue(10000);
  6348. }
  6349.  
  6350.  
  6351.  
  6352. void MW::on_bt_test_clicked()
  6353. {
  6354.  
  6355.  
  6356. }
  6357.  
  6358.  
  6359. void MW::on_Bt_detection_notes_clicked()
  6360. {
  6361. effacer_calque(scene4,calque_notes_manuelles);
  6362. effacer_calque(scene4,calque_notes_auto);
  6363. detection_notes_auto();
  6364. on_Bt_toggle_visu_notes_clicked();
  6365.  
  6366. }
  6367.  
  6368.  
  6369. void MW::on_Bt_toggle_visu_notes_auto_clicked()
  6370. {
  6371. if(visu_notes_auto == 0)
  6372. {
  6373. visu_notes_auto = 1;
  6374. Bt_toggle_visu_notes_auto->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(0, 255, 0);"); // vert
  6375. calque_notes_auto->setVisible(true);
  6376. //detection_notes_auto();
  6377. // tri_liste_notes_par_num_barre(); //les notes seront triées par temps croissant
  6378. //numerotation_liste_notes(); //les notes seront numérotées par temps croissant
  6379. // affiche_liste_notes();
  6380. // trace_liste_notes();
  6381. }
  6382. else
  6383. {
  6384. Bt_toggle_visu_notes_auto->setStyleSheet("color: rgb(0, 0, 0); background-color: rgb(200, 200, 200);");
  6385. visu_notes_auto = 0;
  6386. //effacer_calque(scene4,calque_notes_auto);
  6387. calque_notes_auto->setVisible(false);
  6388. }
  6389. }
  6390.  
  6391.  
  6392. void MW::on_Bt_m10_clicked()
  6393. {
  6394. doubleSpinBox_vitesse->setValue(doubleSpinBox_vitesse->value()-10);
  6395. }
  6396.  
  6397.  
  6398. void MW::on_Bt_p10_clicked()
  6399. {
  6400. doubleSpinBox_vitesse->setValue(doubleSpinBox_vitesse->value()+10);
  6401. }
  6402.  
  6403.  
  6404. void MW::on_doubleSpinBox_gain_valueChanged(double arg1)
  6405. {
  6406. checkBox_rapide->setChecked(false);
  6407. traitement_signal();
  6408. tracer_signal_complet();
  6409. }
  6410.  
  6411.  
  6412. void MW::on_Bt_test2_clicked()
  6413. {
  6414. // load fichier wav qui contient les fréquences test
  6415. // Le fichier .wav comprend un signal audio stéréo échantilloné à 48 000 octets/seconde pour chaque canal
  6416. // ce qui fait 96000 octets/s pour l'ensemble du signal stéréo
  6417.  
  6418. effacer_calque(scene1,calque_trace_signal1 );
  6419. effacer_calque(scene1,calque_trace_FFT );
  6420. effacer_calque(scene1,calque_lignes_F_zero );
  6421. effacer_calque(scene1,calque_encadrement1 );
  6422.  
  6423. string_currentFile = "./tonalites_midi/48_kHz/40-82.wav"; // dans le dossier de l'éxécutable
  6424.  
  6425. save_fichier_ini();
  6426. lineEdit_1->setText(string_currentFile);
  6427. int p1= string_currentFile.lastIndexOf('/');
  6428. string_currentDir = string_currentFile.left(p1);
  6429. lineEdit_current_dir->setText(string_currentDir);
  6430. save_fichier_ini();
  6431. file_wav.setFileName(string_currentFile);
  6432. if (!file_wav.open(QIODevice::ReadOnly))
  6433. {
  6434. wav_ok = false;
  6435. //Bt_scan_auto->setStyleSheet("background-color: rgb(200, 200, 200);");
  6436. return ;
  6437. }
  6438. else
  6439. {
  6440. binStream1.setDevice(&file_wav); // accès à la totalité du fichier wav
  6441. wav_ok = true;
  6442. Bt_scan_auto->setStyleSheet("background-color: rgb(0, 255, 0);"); // vert
  6443.  
  6444. }
  6445. // le fichier reste ouvert pour toute la session
  6446.  
  6447. decode_entete();
  6448.  
  6449. MW::setCursor(Qt::WaitCursor);
  6450. liste_ENR_FFT.clear();
  6451. effacer_calque(scene1,calque_trace_signal1 );
  6452. effacer_calque(scene1, calque_trace_FFT);
  6453. clear_temp_data();
  6454. garnis_temp_data(0);
  6455. // ajustement_gain();
  6456. // donne accès à la totalité (2MB) du fichier wav (dans le 'temp_data')
  6457. tracer_signal_complet();
  6458. MW::setCursor(Qt::ArrowCursor);
  6459. tracer_gradu_temporelle_signal_entree();
  6460.  
  6461. // frame_3->setVisible(true);
  6462. // Bt_scan_auto->setVisible(true);
  6463. // checkBox_rapide->setVisible(true);
  6464.  
  6465.  
  6466. if ( ! liste_ENR_FFT.isEmpty()) {on_Bt_efface_clicked();}
  6467.  
  6468. spinBox_6->setValue(0);
  6469. Timer3->start(100);
  6470.  
  6471. }
  6472.  
  6473.  
  6474. void MW::on_Bt_open_DIR_2_clicked()
  6475. {
  6476. on_Bt_open_DIR_clicked();
  6477. }
  6478.  
  6479.  
  6480. void MW::on_spinBox_nb_barres_valueChanged(int arg1)
  6481. {
  6482. effacer_calque(scene4, calque_grille_T);
  6483. tracer_grille_T();
  6484. }
  6485.  
  6486.  
  6487. void MW::on_spinBox_barre_zero_valueChanged(int arg1)
  6488. {
  6489. effacer_calque(scene4, calque_grille_T);
  6490. tracer_grille_T();
  6491. }
  6492.  
  6493.  
  6494. void MW::on_Bt_10_clicked()
  6495. {
  6496. QMessageBox msgBox;
  6497. QString s1;
  6498. s1 = "Les notes sont dans une premier temps attachées à la grille T (Temporelle, fixe, 1/40s)"; s1 += "\n";
  6499. s1 += "Ensuite la grille M (Mesures) permet"; s1 += "\n";
  6500. s1 += "de placer leur double au plus près du tempo théorique"; s1 += "\n";
  6501. s1 += "La grille M (Mesures) doit être configurée manuellement"; s1 += "\n";
  6502. s1 += "(par 'x0' et 'dt' en haut)"; s1 += "\n";
  6503. s1 += "Le bouton 'Place T->M' sert à créer ces doubles"; s1 += "\n";
  6504. s1 += "et les place automatiquement sur la barre de mesure la plus proche"; s1 += "\n";
  6505.  
  6506. s1 += ""; s1 += "\n";
  6507.  
  6508. msgBox.setText(s1);
  6509. msgBox.exec();
  6510. }
  6511.  
  6512.  
  6513. void MW::on_Bt_11_clicked()
  6514. {
  6515. QMessageBox msgBox;
  6516. QString s1;
  6517.  
  6518. s1 += "Pour déplacer une note sur la grille:"; s1 += "\n";
  6519. s1 += "1) cliquez sur la note pour la sélectionner"; s1 += "\n";
  6520. s1 += "2) cliquez sur les boutons '<' et '>' et '^' et 'v' "; s1 += "\n";
  6521. s1 += "\n";
  6522.  
  6523. s1 += ""; s1 += "\n";
  6524.  
  6525. s1 += "Pour déplacer plusieurs notes sur la grille:"; s1 += "\n";
  6526. s1 += "Cochez Sélect/boite" ; s1 += "\n";
  6527. s1 += "sélectonnez les notes par un rectangle (en déplaçant la souris avec bouton gauche restant appuyé)"; s1 += "\n";
  6528. s1 += "Puis cliquez sur les boutons '<' et '>' et '^' et 'v' "; s1 += "\n";
  6529. s1 += "Idem pour supprimer plusieurs notes, sélectionner puis clic sur le bouton 'xx' "; s1 += "\n";
  6530. s1 += "\n";
  6531.  
  6532. s1 += "Les petits tirets colorés horizontaux indiquent les Harmoniques freq x2(prem. H) et freq x3 (second H)";
  6533.  
  6534. msgBox.setText(s1);
  6535. msgBox.exec();
  6536. }
  6537.  
  6538.  
  6539.  
  6540. void MW::on_Bt_RAZ_general_clicked()
  6541. {
  6542. liste_NOTES.clear();
  6543. liste_ENR_FFT.clear();
  6544. parametrages();
  6545. GV_grillesTM->horizontalScrollBar()->setValue(0);
  6546. graphicsView1->verticalScrollBar()->setValue(0);
  6547. }
  6548.  
  6549.  
  6550.  
  6551. void MW::on_spinBox_x0a_valueChanged(int arg1)
  6552. {
  6553. effacer_calque(scene4, calque_echelle_temporelle_T);
  6554. effacer_calque(scene4, calque_echelle_temporelle_M);
  6555. effacer_calque(scene4, calque_grille_M);
  6556.  
  6557. on_Bt_copy_nt_T_to_M_clicked();
  6558.  
  6559. trace_liste_notes();
  6560. tracer_grille_M();
  6561. tracer_echelle_temps_TAB_NOTES();
  6562. }
  6563.  
  6564.  
  6565. void MW::on_doubleSpinBox_x0b_valueChanged(double arg1)
  6566. {
  6567. effacer_calque(scene4, calque_echelle_temporelle_T);
  6568. effacer_calque(scene4, calque_echelle_temporelle_M);
  6569. effacer_calque(scene4, calque_grille_M);
  6570.  
  6571. on_Bt_copy_nt_T_to_M_clicked();
  6572.  
  6573. trace_liste_notes();
  6574. tracer_grille_M();
  6575. tracer_echelle_temps_TAB_NOTES();
  6576. }
  6577.  
  6578.  
  6579.  
  6580. void MW::on_Bt_copy_nt_T_to_M_clicked()
  6581. {
  6582. if(checkBox_GI->isChecked()) {return;}
  6583.  
  6584. uint32_t n_max = liste_NOTES.length();
  6585.  
  6586. //qDebug() << "n_max" << n_max;
  6587.  
  6588. uint32_t nb_M;
  6589.  
  6590. for(uint32_t n=0; n<n_max; n++)
  6591. {
  6592. nb_M = calcul_n_barreM_note(n);
  6593. liste_NOTES[n].n_barreM = nb_M;
  6594. }
  6595. mode='M';
  6596. affiche_liste_notes();
  6597. trace_liste_notes();
  6598. }
  6599.  
  6600.  
  6601. void efface_notes_T()
  6602. {
  6603. int16_t n_max = liste_NOTES.length();
  6604. for(int n=0; n<n_max; n++)
  6605. {
  6606. liste_NOTES[n].n_barreT = 0;
  6607. }
  6608. }
  6609.  
  6610.  
  6611.  
  6612. void MW::on_Bt_copy_nt_M_to_T_clicked()
  6613. {
  6614. if(checkBox_GI->isChecked()) {return;}
  6615.  
  6616. int n_max = liste_NOTES.length();
  6617. int nb_T;
  6618.  
  6619. efface_notes_T();
  6620.  
  6621. for(int n=0; n<n_max; n++)
  6622. {
  6623. nb_T = calcul_n_barreT_note(n);
  6624. //nb_T = liste_NOTES[n].n_barreM * 14 ; //8.5; // méthode directe. à voir...
  6625. if (nb_T < 5000) {liste_NOTES[n].n_barreT = nb_T;}
  6626. }
  6627. mode='T';
  6628. mode_grille_T();
  6629. affiche_liste_notes();
  6630. trace_liste_notes();
  6631. }
  6632.  
  6633.  
  6634.  
  6635. void MW::on_radioButton_D_clicked()
  6636. {
  6637. affiche_histogramme();
  6638. }
  6639.  
  6640.  
  6641. void MW::on_radioButton_M_clicked()
  6642. {
  6643. affiche_histogramme();
  6644. }
  6645.  
  6646.  
  6647. void MW::on_radioButton_H_clicked()
  6648. {
  6649. affiche_histogramme();
  6650. }
  6651.  
  6652.  
  6653. void MW::on_Bt_dedoubleM_clicked()
  6654. {
  6655. int n_max = liste_NOTES.length();
  6656. for(int n=0; n<n_max; n++)
  6657. {
  6658. liste_NOTES[n].n_barreM = liste_NOTES[n].n_barreM *2;
  6659. }
  6660. tracer_grille_M();
  6661. trace_liste_notes();
  6662.  
  6663. }
  6664.  
  6665.  
  6666. void MW::on_Bt_bak1_clicked()
  6667. {
  6668.  
  6669. QString filename1 = string_currentDir+ "/BAK.NTS";
  6670. QFile file1(filename1);
  6671. if (file1.exists())
  6672. {
  6673. liste_NOTES.clear();
  6674. effacer_calque(scene4,calque_notes_manuelles);
  6675. effacer_calque(scene4,calque_notes_auto);
  6676. effacer_calque(scene4,calque_notes_jouee);
  6677. effacer_calque(scene5, calque_histogramme );
  6678. effacer_calque(scene4, calque_echelle_temporelle_T);
  6679. effacer_calque(scene4, calque_echelle_temporelle_M);
  6680.  
  6681. load_fichier_NOTES("BAK");
  6682. on_Bt_toggle_grille_M_clicked();
  6683. }
  6684. else
  6685. {
  6686. QMessageBox msgBox;
  6687. QString s1="pas de Fichier BAK.NTS !";
  6688. msgBox.setText(s1); msgBox.exec();
  6689. }
  6690. }
  6691.  
  6692.  
  6693. void MW::on_checkBox_numerotation_toggled(bool checked)
  6694. {
  6695. tracer_grille_M();
  6696. }
  6697.  
  6698.  
  6699. void MW::on_Bt_copie_notes_clicked()
  6700. {
  6701. write_mode = 5;
  6702. MW::setCursor(Qt::CrossCursor);
  6703. // voir le write_mode 5 dans la fonction 'mousePressEvent' pour la suite évènementielle..
  6704. }
  6705.  
  6706.  
  6707. void MW::on_Bt_12_clicked()
  6708. {
  6709. QMessageBox msgBox;
  6710. QString s1;
  6711. s1 = "COPIE D'UN ACCORD (=notes alignées verticalement sur la même barre)"; s1 += "\n";
  6712. s1 += "1) cliquez sur le bouton jaune pour lancer le mode copie d'accord"; s1 += "\n";
  6713. s1 += "2) cliquez sur la barre temporelle contenant les notes de l'accord à copier"; s1 += "\n";
  6714. s1 += "3) puis cliquez sur une autre barre (destination)"; s1 += "\n";
  6715. msgBox.setText(s1);
  6716. msgBox.exec();
  6717. }
  6718.  
  6719.  
  6720.  
  6721.  
  6722. void MW::on_checkBox_GI_clicked(bool checked)
  6723. {
  6724. if (checked == true)
  6725. {
  6726. Bt_copy_nt_M_to_T->setStyleSheet("background-color: rgb(100, 100, 100);");
  6727. Bt_copy_nt_T_to_M->setStyleSheet("background-color: rgb(100, 100, 100);");
  6728. }
  6729. else
  6730. {
  6731. Bt_copy_nt_M_to_T->setStyleSheet("background-color: rgb(0, 255, 0);");
  6732. Bt_copy_nt_T_to_M->setStyleSheet("background-color: rgb(0, 255, 0);");
  6733. }
  6734. }
  6735.  
  6736.  
  6737. void MW::on_Bt_13_clicked()
  6738. {
  6739. QMessageBox msgBox;
  6740. QString s1;
  6741. s1 = "Rendre les grilles M et T indépendantes permet de travailler uniquement sur la grille M"; s1 += "\n";
  6742. s1 += "par exemple pour composer un morceau ou des accords manuellement"; s1 += "\n";
  6743. s1 += "en évitant des surprises lors du changement d'échelle temporelle"; s1 += "\n";
  6744. s1 += "(Les notes resteront attachées à la même barre temporelle)"; s1 += "\n";
  6745. msgBox.setText(s1);
  6746. msgBox.exec();
  6747. }
  6748.  
  6749.  
  6750. void MW::on_Bt_14_clicked()
  6751. {
  6752. QMessageBox msgBox;
  6753. QString s1;
  6754. s1 = "La roulette de la souris permet de modifier la valeur rapidement"; s1 += "\n";
  6755. s1 += "CTRL + roulette permet encore + de rapidité"; s1 += "\n";
  6756. s1 += ""; s1 += "\n";
  6757. s1 += ""; s1 += "\n";
  6758. msgBox.setText(s1);
  6759. msgBox.exec();
  6760. }
  6761.  
  6762.  
  6763. void MW::on_Bt_15_clicked()
  6764. {
  6765. QMessageBox msgBox;
  6766. QString s1;
  6767. s1 ="Les instruments de musique ne sont pas toujours 'bien' accordés (La=440Hz) involontairement ou volontairement..."; s1 += "\n";
  6768. s1 += "Si cette appli détecte mal les frq (hésitation +/-1/2 ton) cette valeur permet d'ajuster la détection."; s1 += "\n";
  6769. s1 += "Vous trouverez aussi des notes 'pures' dans le dossier 'tonalites_midi' dans le fichier documents.zip";
  6770.  
  6771. msgBox.setText(s1);
  6772. msgBox.exec();
  6773. }
  6774.  
  6775. void MW::on_spinBox_offset_valueChanged(int arg1)
  6776. {
  6777. calcul_ofsset();
  6778. traitement_signal();
  6779. }
  6780.  
  6781.  
  6782. void MW::on_spinBox_echx_valueChanged(int arg1)
  6783. {
  6784. calcul_ofsset();
  6785. traitement_signal();
  6786. }
  6787.  
  6788.  
  6789.  
  6790. void MW::on_Bt_par_defaut_clicked()
  6791. {
  6792. doubleSpinBox_gain->setValue(0.20);
  6793. spinBox_offset->setValue(-2124); // -1250 ; +/- 22 pour un décalage de +/-1/4 de ton
  6794. doubleSpinBox_echx->setValue(499); // 388
  6795. }
  6796.  
  6797.  
  6798. void MW::on_Bt_composition_clicked()
  6799. {
  6800. spinBox_duree->setValue(1);
  6801. on_spinBox_duree_valueChanged(2);// noire
  6802. visu_freq = true;
  6803. on_Bt_toggle_visu_freq_clicked(); // ce qui le repasse à false, avec actions correspondantes
  6804.  
  6805. mode_composition = true;
  6806. on_Bt_toggle_grille_M_clicked();
  6807. frame_cle_de_sol->setVisible(true);
  6808.  
  6809. affi_clef();
  6810.  
  6811.  
  6812.  
  6813. frame_composeur->setVisible(true);
  6814.  
  6815. on_spinBox_hauteur_valueChanged(0);
  6816.  
  6817. spinBox_duree->setValue(1);
  6818. //on_spinBox_duree_valueChanged(1);
  6819. }
  6820.  
  6821.  
  6822. void MW::on_Bt_5_clicked()
  6823. {
  6824. mode_composition = false;
  6825. frame_cle_de_sol->setVisible(false);
  6826. frame_composeur->setVisible(false);
  6827. }
  6828.  
  6829.  
  6830. void MW::on_spinBox_hauteur_valueChanged(int arg1)
  6831. {
  6832. if (arg1==12) { spinBox_hauteur->setValue(0); spinBox_octave->stepUp(); return;}
  6833. if (arg1==-1) { spinBox_hauteur->setValue(11); spinBox_octave->stepDown(); return;}
  6834.  
  6835. QString s1;
  6836. s1 = gamme_chromatique_d[spinBox_hauteur->value()];
  6837. lineEdit_nom->setText(s1);
  6838.  
  6839. int midi = 36-12 + arg1 + 12*spinBox_octave->value(); // 36
  6840. affi_txt_en_couleur(midi, lineEdit_nom);
  6841. s1.setNum(midi);
  6842. lineEdit_midi->setText(s1);
  6843.  
  6844. effacer_calque(scene4, calque_surbrillance);
  6845. surbrille_barre(num_barre_saisie, "#00FF00");
  6846. // encadre_midi(midi);
  6847. }
  6848.  
  6849.  
  6850.  
  6851. void MW::on_spinBox_octave_valueChanged(int arg1)
  6852. {
  6853. QString s1;
  6854. s1 = gamme_chromatique_d[spinBox_hauteur->value()];
  6855. lineEdit_nom->setText(s1);
  6856.  
  6857. int midi = 36-12 + spinBox_hauteur->value() + 12*arg1;
  6858. s1.setNum(midi);
  6859. lineEdit_midi->setText(s1);
  6860. effacer_calque(scene4, calque_surbrillance);
  6861. surbrille_barre(num_barre_saisie, "#00FF00");
  6862.  
  6863. encadre_midi(midi);
  6864. }
  6865.  
  6866.  
  6867.  
  6868.  
  6869. void MW::on_spinBox_duree_valueChanged(int arg1)
  6870. {
  6871. QString s1, s2;
  6872. duree_int = pow(2, 4-arg1); // variable globale
  6873. s1.setNum(duree_int);
  6874. lineEdit_duree_int->setText(s1);
  6875.  
  6876. if (! checkBox_silence->isChecked()) {s2 = types_note[arg1];}
  6877. else
  6878. {
  6879. s2 = types_silence[arg1];
  6880. affi_silence();
  6881. }
  6882.  
  6883. lineEdit_duree_txt->setText(s2);
  6884. surbrille_barre(num_barre_saisie, "#00FF00");
  6885. }
  6886.  
  6887.  
  6888. void MW::on_Bt_16_clicked()
  6889. {
  6890. QMessageBox msgBox;
  6891. QString s1;
  6892. s1 = "Le trait vertical (vert) indique la barre ou se placera la note suivante ";
  6893. s1 += "(en fonction de la durée choisie pour la note précédente)"; s1 += "\n";
  6894. s1 += "La durée des notes n'est (volontairement) pas enregistrée dans les notes ";
  6895. s1 += "ce qui permet de ne PAS affecter l'emplacement de toutes les notes ";
  6896. s1 += "dans la trame temporelle lors de la modification, l'ajout ou la suppression d'une note"; s1 += "\n";
  6897. s1 += "Le tempo et le rythme sont ainsi conservés."; s1 += "\n";
  6898. s1 += "C'est d'ailleurs (me semble-t-il) l'approche retenue dans la norme midi."; s1 += "\n";
  6899. s1 += "On peut à tout moment ajouter 'manuellement' une note avec le bouton 'W' du panneau Gestion notes"; s1 += "\n";
  6900. s1 += "Ce qui fait basculer dans le mode Write, puis clic sur la grille"; s1 += "\n";
  6901. msgBox.setText(s1);
  6902. msgBox.exec();
  6903. }
  6904.  
  6905.  
  6906. void MW::Ajouter_note(int midi)
  6907. {
  6908. if (checkBox_pause->isChecked()) {midi =0;}
  6909. ajout_note(midi, 0, num_barre_saisie);
  6910. play_note(midi);
  6911.  
  6912. //int d1 = 4 - spinBox_duree->value();
  6913. //int d2 = pow(2, d1);
  6914. num_barre_saisie += duree_int;
  6915.  
  6916. effacer_calque(scene4,calque_notes_manuelles);
  6917. //effacer_calque(scene4,calque_notes_jouee);
  6918. tri_liste_notes_par_num_barre(); // les notes seront triées par num_barre croissant
  6919. numerotation_liste_notes(); // les notes seront numérotées par num_barre croissant
  6920. affiche_liste_notes();
  6921. trace_liste_notes();
  6922. surbrille_barre(num_barre_saisie, "#00FF00");
  6923. spinBox_num_barre->setValue(num_barre_saisie);
  6924. }
  6925.  
  6926.  
  6927.  
  6928. void MW::on_Bt_ajout_clicked()
  6929. {
  6930. if(!checkBox_silence->isChecked())
  6931. {
  6932. int midi = 36 + spinBox_hauteur->value() + 12*spinBox_octave->value();
  6933. Ajouter_note(midi);
  6934.  
  6935. }
  6936. else
  6937. {
  6938. //n'ajoute pas de note, décalle juste la barre de saisie de la note suivante vers la droite
  6939. num_barre_saisie += duree_int;
  6940. surbrille_barre(num_barre_saisie, "#00FF00");
  6941. }
  6942. }
  6943.  
  6944.  
  6945.  
  6946. void MW::on_Bt_aj_MAJ_clicked()
  6947. {
  6948. int tonique = 36 + spinBox_hauteur->value() + 12*spinBox_octave->value();
  6949. int A = tonique;
  6950. int B = tonique +4;
  6951. int C = tonique +7;
  6952.  
  6953. Ajouter_note(A);
  6954. num_barre_saisie -= duree_int; Ajouter_note(B);
  6955. num_barre_saisie -= duree_int; Ajouter_note(C);
  6956. }
  6957.  
  6958.  
  6959. void MW::on_Bt_aj_Min_clicked()
  6960. {
  6961. int tonique = 36 + spinBox_hauteur->value() + 12*spinBox_octave->value();
  6962. int A = tonique;
  6963. int B = tonique +3;
  6964. int C = tonique +7;
  6965.  
  6966. Ajouter_note(A);
  6967. num_barre_saisie -= duree_int; Ajouter_note(B);
  6968. num_barre_saisie -= duree_int; Ajouter_note(C);
  6969. }
  6970.  
  6971.  
  6972. void MW::on_Bt_aj_7dom_clicked()
  6973. {
  6974. int tonique = 36 + spinBox_hauteur->value() + 12*spinBox_octave->value();
  6975. int A = tonique;
  6976. int B = tonique +4;
  6977. int C = tonique +7;
  6978. int D = tonique +10;
  6979.  
  6980. Ajouter_note(A);
  6981. num_barre_saisie -= duree_int; Ajouter_note(B);
  6982. num_barre_saisie -= duree_int; Ajouter_note(C);
  6983. num_barre_saisie -= duree_int; Ajouter_note(D);
  6984. }
  6985.  
  6986.  
  6987.  
  6988. void MW::on_Bt_transposer_clicked()
  6989. {
  6990. int n_max = liste_NOTES.length();
  6991. for(int n=0; n<n_max; n++)
  6992. {
  6993. liste_NOTES[n].midi += spinBox_transposition->value();
  6994. }
  6995. affiche_liste_notes();
  6996. trace_liste_notes();
  6997. }
  6998.  
  6999.  
  7000. /*
  7001. void MW::on_Bt_deselect_clicked()
  7002. {
  7003.   deselect_notes();
  7004.   effacer_calque(scene4, calque_surbrillance);
  7005.   effacer_calque(scene4, calque_notes_jouee);
  7006.   effacer_calque(scene4, calque_rect_select);
  7007. }
  7008. */
  7009.  
  7010.  
  7011. void MW::on_checkBox_sel_boite_clicked()
  7012. {
  7013. if(checkBox_sel_boite->isChecked())
  7014. {
  7015. Bt_mode_E->setVisible(false);
  7016. frame_move->setVisible(true);
  7017. label_SEL_P_BOITE->setVisible(true);
  7018. Bt_mode_E_2->setStyleSheet("background-color: rgb(255, 0, 0);"); // rouge
  7019. }
  7020. else
  7021. {
  7022. Bt_mode_E->setVisible(true);
  7023. frame_move->setVisible(false);
  7024. label_SEL_P_BOITE->setVisible(false);
  7025. Bt_mode_E_2->setStyleSheet("background-color: rgb(200, 200, 200);"); // gris
  7026. effacer_calque(scene4, calque_rect_select);
  7027. deselect_notes();
  7028. effacer_calque(scene4, calque_notes_jouee);
  7029.  
  7030. }
  7031. }
  7032.  
  7033.  
  7034. void MW::affi_clef()
  7035. {
  7036. QString image_filename;
  7037. QImage image1;
  7038. image_filename = "./cles3r.jpg";
  7039. image1.load(image_filename);
  7040.  
  7041. label_image1->setGeometry(0, 0, 131, 101);
  7042. label_image1->setPixmap(QPixmap::fromImage(image1));
  7043. label_image1->adjustSize();
  7044. }
  7045.  
  7046.  
  7047. void MW::affi_silence()
  7048. {
  7049. QString image_filename;
  7050. QString s1;
  7051.  
  7052. int n =spinBox_duree->value();
  7053.  
  7054. s1.setNum(n);
  7055. QImage image1;
  7056.  
  7057. image_filename = "./silence" + s1 + ".jpg";
  7058. image1.load(image_filename);
  7059.  
  7060. label_image1->setGeometry(20, 100, 131, 101);
  7061. label_image1->setPixmap(QPixmap::fromImage(image1));
  7062. label_image1->adjustSize();
  7063.  
  7064. }
  7065.  
  7066.  
  7067.  
  7068. void MW::on_checkBox_silence_clicked()
  7069. {
  7070. if(checkBox_silence->isChecked()) { affi_silence(); } else { affi_clef(); }
  7071. on_spinBox_duree_valueChanged(spinBox_duree->value());
  7072. }
  7073.  
  7074.  
  7075. void MW::on_spinBox_num_barre_valueChanged(int arg1)
  7076. {
  7077. num_barre_saisie = arg1;
  7078. surbrille_barre(num_barre_saisie, "#FFFF00");
  7079. }
  7080.  
  7081.  
  7082. void MW::on_spinBox_num_note_valueChanged(int arg1)
  7083. {
  7084. num_note_jouee = arg1;
  7085. spinBox_10->setValue(num_note_jouee); // 'debut'
  7086. joue_1_note_de_la_liste();
  7087. }
  7088.  
  7089. // =====================================================================================================
  7090. // code ONGLET INSTRUMENTS
  7091. // =====================================================================================================
  7092.  
  7093. // chemin relatif / dossier de l'exécutable
  7094. //uint16_t largeur_image = 1216; // image du manche de la guitare
  7095. //uint16_t hauteur_image = 180;
  7096.  
  7097. //QList<QString> liste_couleurs;
  7098.  
  7099.  
  7100. void MW::init_onglet_instruments()
  7101. {
  7102.  
  7103. liste_couleurs <<"#EF2929"<<"#FF5C00"<<"#FCAF3E"<<"#FFE300"<<"#BFFF00"<<"#07F64F"
  7104. <<"#16D298"<<"#16D2C4"<<"#00AEFF"<<"#1667D2"<<"#7C00FF"<<"#FF67EF"<<"#EEEEEC";
  7105.  
  7106. // gamme_chromatique<<"Do"<<"Do#"<<"Ré"<<"Ré#"<<"Mi"<<"Fa"<<"Fa#"<<"Sol"<<"Sol#"<<"La"<<"La#"<<"Si";
  7107. // remarque: j'écris toutes les notes altérées avec leur version # et pas b
  7108. // en considérant la gamme tempérée (Mib = Ré#)
  7109. // mais si cherchez l'harmonie chimiquement pure,
  7110. // faudra ajouter un douzième de comma pythagoricien ici et là :)
  7111. // et différencier Ré# de Mib, pareil pour La# et Sib etc... et même jouer avec la quinte du loup.
  7112. }
  7113.  
  7114.  
  7115.  
  7116.  
  7117. void MW::charger_image_manche()
  7118. {
  7119. QString fileName1;
  7120.  
  7121. // repertoire_images = "./images/";
  7122. fileName1 = repertoire_images + "manche3.jpg";
  7123.  
  7124. QFile file1(fileName1);
  7125. if (file1.exists() )
  7126. {
  7127. QImage image1(fileName1);
  7128. image1 = image1.scaledToWidth(largeur_image);
  7129. image1.load(fileName1);
  7130. //imageLabel1->setPixmap(QPixmap::fromImage(image1));
  7131. QGraphicsPixmapItem* item1 = new QGraphicsPixmapItem(QPixmap::fromImage(image1));
  7132. scene_manche->addItem(item1);
  7133. // calque_notes_manche->addToGroup(item1);
  7134. }
  7135. }
  7136.  
  7137.  
  7138. int MW::calcul_midi(int corde_i, int case_i)
  7139. {
  7140. // 40 -> Mi octave 2 (corde 6 à vide)
  7141. int n;
  7142. n = 40 + case_i; // corde6 de Mi grave
  7143. if (corde_i == 5){n+=5;}
  7144. if (corde_i == 4){n+=10;}
  7145. if (corde_i == 3){n+=15;}
  7146. if (corde_i == 2){n+=19;}
  7147. if (corde_i == 1){n+=24;} // corde1 de Mi aigu (+2 octaves)
  7148.  
  7149. //*n_midi = n;
  7150. return n;
  7151.  
  7152. }
  7153.  
  7154. QString MW::nom_note_FR(int mid)
  7155. {
  7156. QString s1;
  7157.  
  7158. int h1 = calcul_hauteur_note(mid);
  7159. //h1-=3;
  7160. if(h1<0){h1+=12;}
  7161. if(h1>11){h1-=12;}
  7162.  
  7163. if((h1<0) || ( h1>= gamme_chromatique_b.length())) {return "-";}
  7164. s1 = gamme_chromatique_b[h1];
  7165. return s1;
  7166. }
  7167.  
  7168.  
  7169. void MW::affiche_details_note(uint midi)
  7170. {
  7171. QString s1;
  7172. s1.setNum(midi);
  7173. s1 = "m" + s1;
  7174. LDI_7a->setText(s1);
  7175.  
  7176. affi_txt_en_couleur(midi, LDI_7b);
  7177. LDI_7b->setText(nom_note_FR(midi));
  7178.  
  7179. affi_txt_en_couleur(midi, LDI_7e);
  7180.  
  7181. s1=nom_note_GB(midi);
  7182. s1+=nom_octave_GB(midi);
  7183. LDI_7e->setText(s1);
  7184. }
  7185.  
  7186.  
  7187. void MW::calcul_xy_note(int corde_i, int case_i, int *x_i, int *y_i)
  7188. {
  7189. float x;
  7190. float y;
  7191. float dy;
  7192. float y0;
  7193. float ech;
  7194.  
  7195. if (case_i >= positionsX.length())
  7196. {
  7197. *x_i=1;
  7198. *y_i=1;
  7199. return;
  7200. }
  7201. x=positionsX[case_i];
  7202.  
  7203. y0=100; // 72
  7204.  
  7205. ech=1+case_i/90.0;
  7206. dy=-20.0*((7-corde_i)-3.2);
  7207.  
  7208. dy *= ech;
  7209. y=y0+dy;
  7210.  
  7211. *x_i=int(x);
  7212. *y_i=int(y);
  7213. }
  7214.  
  7215.  
  7216. void MW::dessine_1_note(int corde_i, int case_i, QColor couleur_i)
  7217. {
  7218. int x, y;
  7219. // case_i = 0..20 (0 -> corde à vide)
  7220.  
  7221.  
  7222. if ( (case_i < case_min) || (case_i > case_max) ) {return;}
  7223.  
  7224. uint midi = calcul_midi(corde_i, case_i);
  7225. affiche_details_note(midi);
  7226.  
  7227. QPen pen_note(couleur_i, 1, Qt::SolidLine);
  7228.  
  7229. if ((case_i>=0) && (case_i<=20))
  7230. {
  7231.  
  7232. calcul_xy_note(corde_i, case_i, &x, &y);
  7233.  
  7234. ellipse1 = new QGraphicsEllipseItem(x, y, 15, 15);
  7235. ellipse1->setPen(pen_note);
  7236. if (notes_pleines == true) {ellipse1->setBrush(couleur_i);}
  7237. calque_notes_manche->addToGroup(ellipse1);
  7238.  
  7239. memo_case_i=case_i;
  7240. memo_corde_i=corde_i;
  7241. }
  7242. }
  7243.  
  7244.  
  7245. void MW::set_couleur_label(QColor c1, QLabel *Lb_i)
  7246. {
  7247. QVariant variant1 = c1;
  7248. QString couleurCode = variant1.toString();
  7249. Lb_i->setStyleSheet("QLabel { background-color :"+couleurCode+" ; color : white; }");
  7250. }
  7251.  
  7252.  
  7253. void MW::on_Bt_E3_clicked()
  7254. {
  7255. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7256. int n_midi=40;
  7257. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7258.  
  7259. play_note(n_midi); // numérotation MIDI
  7260. QColor c=liste_couleurs[4];
  7261. dessine_1_note(6, 0, c); // sur le manche
  7262. set_couleur_label(c, label5); // près de la touche piano
  7263. }
  7264.  
  7265.  
  7266.  
  7267. void MW::on_Bt_F3_clicked()
  7268. {
  7269. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7270. int n_midi=41;
  7271. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7272.  
  7273. play_note(n_midi);
  7274. QColor c=liste_couleurs[5];
  7275. dessine_1_note(6, 1, c); // sur le manche
  7276. set_couleur_label(c, label6); // près de la touche piano
  7277. }
  7278.  
  7279.  
  7280. void MW::on_Bt_Fd3_clicked()
  7281. {
  7282. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7283. int n_midi=42;
  7284. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7285.  
  7286. play_note(n_midi);
  7287. QColor c=liste_couleurs[6];
  7288. dessine_1_note(6, 2, c); // sur le manche
  7289. set_couleur_label(c, label7); // près de la touche piano
  7290. }
  7291.  
  7292.  
  7293. void MW::on_Bt_G3_clicked()
  7294. {
  7295. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7296. int n_midi=43;
  7297. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7298.  
  7299. play_note(n_midi);
  7300. QColor c=liste_couleurs[7];
  7301. dessine_1_note(6, 3, c); // sur le manche
  7302. set_couleur_label(c, label8); // près de la touche piano
  7303. }
  7304.  
  7305. void MW::on_Bt_Gd3_clicked()
  7306. {
  7307. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7308. int n_midi=44;
  7309. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7310.  
  7311. play_note(n_midi);
  7312. QColor c=liste_couleurs[8];
  7313. dessine_1_note(6, 4, c); // sur le manche
  7314. set_couleur_label(c, label9); // près de la touche piano
  7315. }
  7316.  
  7317. void MW::on_Bt_A3_clicked()
  7318. {
  7319. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7320. int n_midi=45;
  7321. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7322.  
  7323. play_note(n_midi);
  7324. QColor c=liste_couleurs[9];
  7325. dessine_1_note(6, 5, c); dessine_1_note(5, 0, c); // sur le manche
  7326. set_couleur_label(c, label10); // près de la touche piano
  7327. }
  7328.  
  7329. void MW::on_Bt_Bb3_clicked()
  7330. {
  7331. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7332. int n_midi=46;
  7333. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7334.  
  7335. play_note(n_midi);
  7336. QColor c=liste_couleurs[10];
  7337. dessine_1_note(6, 6, c); dessine_1_note(5, 1, c);
  7338. set_couleur_label(c, label11); // près de la touche piano
  7339. }
  7340.  
  7341. void MW::on_BT_B3_clicked()
  7342. {
  7343. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7344. int n_midi=47;
  7345. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7346.  
  7347. play_note(n_midi);
  7348. QColor c=liste_couleurs[11];
  7349. dessine_1_note(6, 7, c); dessine_1_note(5, 2, c);
  7350. set_couleur_label(c, label12); // près de la touche piano
  7351. }
  7352.  
  7353. void MW::on_Bt_C4_clicked()
  7354. {
  7355. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7356. int n_midi=48;
  7357. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7358.  
  7359. play_note(n_midi);
  7360. QColor c=liste_couleurs[0];
  7361. dessine_1_note(6, 8, c); dessine_1_note(5, 3, c);
  7362. set_couleur_label(c, label1_2);
  7363. }
  7364.  
  7365. void MW::on_Bt_Cd4_clicked()
  7366. {
  7367. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7368. int n_midi=49;
  7369. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7370.  
  7371. play_note(n_midi);
  7372. QColor c=liste_couleurs[1];
  7373. dessine_1_note(6, 9, c); dessine_1_note(5, 4, c);
  7374. set_couleur_label(c, label2_2);
  7375. }
  7376.  
  7377. void MW::on_Bt_D4_clicked()
  7378. {
  7379. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7380. int n_midi=50;
  7381. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7382.  
  7383. play_note(n_midi);
  7384. QColor c=liste_couleurs[2];
  7385. dessine_1_note(6, 10, c); dessine_1_note(5, 5, c); dessine_1_note(4, 0, c);
  7386. set_couleur_label(c, label3_2);
  7387. }
  7388.  
  7389. void MW::on_Bt_Eb4_clicked()
  7390. {
  7391. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7392. int n_midi=51;
  7393. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7394.  
  7395. play_note(n_midi);
  7396. QColor c=liste_couleurs[3];
  7397. dessine_1_note(6, 11, c); dessine_1_note(5, 6, c); dessine_1_note(4, 1, c);
  7398. set_couleur_label(c, label4_2);
  7399. }
  7400.  
  7401. void MW::on_Bt_E4_clicked()
  7402. {
  7403. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7404. int n_midi=52;
  7405. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7406.  
  7407. play_note(n_midi);
  7408. QColor c=liste_couleurs[4];
  7409. dessine_1_note(6, 12, c); dessine_1_note(5, 7, c); dessine_1_note(4, 2, c);
  7410. set_couleur_label(c, label5_2);
  7411. }
  7412.  
  7413. void MW::on_Bt_F4_clicked()
  7414. {
  7415. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7416. int n_midi=53;
  7417. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7418.  
  7419. play_note(n_midi);
  7420. QColor c=liste_couleurs[5];
  7421. dessine_1_note(6, 13, c); dessine_1_note(5, 8, c); dessine_1_note(4, 3, c);
  7422. set_couleur_label(c, label6_2);
  7423. }
  7424.  
  7425. void MW::on_Bt_Fd4_clicked()
  7426. {
  7427. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7428. int n_midi=54;
  7429. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7430.  
  7431. play_note(n_midi);
  7432. QColor c=liste_couleurs[6];
  7433. dessine_1_note(6, 14, c); dessine_1_note(5, 9, c); dessine_1_note(4, 4, c);
  7434. set_couleur_label(c, label7_2);
  7435. }
  7436.  
  7437. void MW::on_Bt_G4_clicked()
  7438. {
  7439. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7440. int n_midi=55;
  7441. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7442.  
  7443. play_note(n_midi);
  7444. QColor c=liste_couleurs[7];
  7445. dessine_1_note(6, 15, c); dessine_1_note(5, 10, c); dessine_1_note(4, 5, c); dessine_1_note(3, 0, c);
  7446. set_couleur_label(c, label8_2);
  7447. }
  7448.  
  7449. void MW::on_Bt_Gd4_clicked()
  7450. {
  7451. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7452. int n_midi=56;
  7453. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7454.  
  7455. play_note(n_midi);
  7456. QColor c=liste_couleurs[8];
  7457. dessine_1_note(6, 16, c); dessine_1_note(5, 11, c); dessine_1_note(4, 6, c); dessine_1_note(3, 1, c);
  7458. set_couleur_label(c, label9_2);
  7459. }
  7460.  
  7461. void MW::on_Bt_A4_clicked()
  7462. {
  7463. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7464. int n_midi=57;
  7465. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7466.  
  7467. play_note(n_midi);
  7468. QColor c=liste_couleurs[9];
  7469. dessine_1_note(6, 17, c); dessine_1_note(5, 12, c); dessine_1_note(4, 7, c); dessine_1_note(3, 2, c);
  7470. set_couleur_label(c, label10_2);
  7471. }
  7472.  
  7473. void MW::on_Bt_Bb4_clicked()
  7474. {
  7475. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7476. int n_midi=58;
  7477. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7478.  
  7479. play_note(n_midi);
  7480. QColor c=liste_couleurs[10];
  7481. dessine_1_note(6, 18, c); dessine_1_note(5, 13, c); dessine_1_note(4, 8, c); dessine_1_note(3, 3, c);
  7482. set_couleur_label(c, label11_2);
  7483. }
  7484.  
  7485. void MW::on_Bt_B4_clicked()
  7486. {
  7487. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7488. int n_midi=59;
  7489. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7490.  
  7491. play_note(n_midi);
  7492. QColor c=liste_couleurs[11];
  7493. dessine_1_note(2, 0, c); dessine_1_note(3, 4, c); dessine_1_note(4, 9, c); dessine_1_note(5, 14, c);
  7494. set_couleur_label(c, label12_2);
  7495. }
  7496.  
  7497. void MW::on_Bt_C5_clicked()
  7498. {
  7499. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7500. int n_midi=60;
  7501. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7502.  
  7503. play_note(n_midi);
  7504. QColor c=liste_couleurs[0];
  7505. dessine_1_note(2, 1, c); dessine_1_note(3, 5, c); dessine_1_note(4, 10, c); dessine_1_note(5, 15, c);
  7506. set_couleur_label(c, label1_3);
  7507. }
  7508.  
  7509. void MW::on_Bt_Cd5_clicked()
  7510. {
  7511. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7512. int n_midi=61;
  7513. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7514.  
  7515. play_note(n_midi);
  7516. QColor c=liste_couleurs[1];
  7517. dessine_1_note(2, 2, c); dessine_1_note(3, 6, c); dessine_1_note(4, 11, c); dessine_1_note(5, 16, c);
  7518. set_couleur_label(c, label2_3);
  7519. }
  7520.  
  7521. void MW::on_Bt_D5_clicked()
  7522. {
  7523. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7524. int n_midi=62;
  7525. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7526.  
  7527. play_note(n_midi);
  7528. QColor c=liste_couleurs[2];
  7529. dessine_1_note(2, 3, c); dessine_1_note(3, 7, c); dessine_1_note(4, 12, c); dessine_1_note(5, 17, c);
  7530. set_couleur_label(c, label3_3);
  7531. }
  7532.  
  7533. void MW::on_Bt_Eb5_clicked()
  7534. {
  7535. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7536. int n_midi=63;
  7537. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7538.  
  7539. play_note(n_midi);
  7540. QColor c=liste_couleurs[3];
  7541. dessine_1_note(2, 4, c); dessine_1_note(3, 8, c); dessine_1_note(4, 13, c); dessine_1_note(5, 18, c);
  7542. set_couleur_label(c, label4_3);
  7543. }
  7544.  
  7545. void MW::on_Bt_E5_clicked()
  7546. {
  7547. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7548. int n_midi=64;
  7549. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7550.  
  7551. play_note(n_midi);
  7552. QColor c=liste_couleurs[4];
  7553. dessine_1_note(1, 0, c); dessine_1_note(2, 5, c); dessine_1_note(3, 9, c); dessine_1_note(4, 14, c);
  7554. set_couleur_label(c, label5_3);
  7555.  
  7556. }
  7557.  
  7558. void MW::on_Bt_F5_clicked()
  7559. {
  7560. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7561. int n_midi=65;
  7562. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7563.  
  7564. play_note(n_midi);
  7565. QColor c=liste_couleurs[5];
  7566. dessine_1_note(1, 1, c); dessine_1_note(2, 6, c); dessine_1_note(3, 10, c); dessine_1_note(4, 15, c);
  7567. set_couleur_label(c, label6_3);
  7568. }
  7569.  
  7570. void MW::on_Bt_Fd5_clicked()
  7571. {
  7572. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7573. int n_midi=66;
  7574. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7575.  
  7576. play_note(n_midi);
  7577. QColor c=liste_couleurs[6];
  7578. dessine_1_note(1, 2, c); dessine_1_note(2, 7, c); dessine_1_note(3, 11, c); dessine_1_note(4, 16, c);
  7579. set_couleur_label(c, label7_3);
  7580. }
  7581.  
  7582. void MW::on_Bt_G5_clicked()
  7583. {
  7584. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7585. int n_midi=67;
  7586. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7587.  
  7588. play_note(n_midi);
  7589. QColor c=liste_couleurs[7];
  7590. dessine_1_note(1, 3, c); dessine_1_note(2, 8, c); dessine_1_note(3, 12, c); dessine_1_note(4, 17, c);
  7591. set_couleur_label(c, label8_3);
  7592. }
  7593.  
  7594. void MW::on_Bt_Gd5_clicked()
  7595. {
  7596. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7597. int n_midi=68;
  7598. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7599.  
  7600. play_note(n_midi);
  7601. QColor c=liste_couleurs[8];
  7602. dessine_1_note(1, 4, c); dessine_1_note(2, 9, c); dessine_1_note(3, 13, c); dessine_1_note(4, 18, c);
  7603. set_couleur_label(c, label9_3);
  7604. }
  7605.  
  7606. void MW::on_Bt_A5_clicked()
  7607. {
  7608. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7609. int n_midi=69;
  7610. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7611.  
  7612. play_note(n_midi);
  7613. QColor c=liste_couleurs[9];
  7614. dessine_1_note(1, 5, c); dessine_1_note(2, 10, c); dessine_1_note(3, 14, c);
  7615. set_couleur_label(c, label10_3);
  7616. }
  7617.  
  7618. void MW::on_Bt_Bb5_clicked()
  7619. {
  7620. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7621. int n_midi=70;
  7622. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7623.  
  7624. play_note(n_midi);
  7625. QColor c=liste_couleurs[10];
  7626. dessine_1_note(1, 6, c); dessine_1_note(2, 11, c); dessine_1_note(3, 15, c);
  7627. set_couleur_label(c, label11_3);
  7628. }
  7629.  
  7630. void MW::on_Bt_B5_clicked()
  7631. {
  7632. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7633. int n_midi=71;
  7634. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7635.  
  7636. play_note(n_midi);
  7637. QColor c=liste_couleurs[11];
  7638. dessine_1_note(1, 7, c); dessine_1_note(2, 12, c); dessine_1_note(3, 16, c);
  7639. set_couleur_label(c, label12_3);
  7640. }
  7641.  
  7642.  
  7643. void MW::on_Bt_C6_clicked()
  7644. {
  7645. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7646. int n_midi=72;
  7647. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7648.  
  7649. play_note(n_midi);
  7650. QColor c=liste_couleurs[0];
  7651. dessine_1_note(1, 8, c); dessine_1_note(2, 13, c); dessine_1_note(3, 17, c);
  7652. set_couleur_label(c, label1_4);
  7653. }
  7654.  
  7655. void MW::on_Bt_Cd6_clicked()
  7656. {
  7657. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7658. int n_midi=73;
  7659. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7660.  
  7661. play_note(n_midi);
  7662. QColor c=liste_couleurs[1];
  7663. dessine_1_note(1, 9, c); dessine_1_note(2, 14, c); dessine_1_note(3, 18, c);
  7664. set_couleur_label(c, label2_4);
  7665. }
  7666.  
  7667.  
  7668. void MW::on_Bt_D6_clicked()
  7669. {
  7670. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7671. int n_midi=74;
  7672. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7673.  
  7674. play_note(n_midi);
  7675. QColor c=liste_couleurs[2];
  7676. dessine_1_note(1, 10, c); dessine_1_note(2, 15, c);
  7677. set_couleur_label(c, label3_4);
  7678. }
  7679.  
  7680. void MW::on_Bt_Eb6_clicked()
  7681. {
  7682. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7683. int n_midi=75;
  7684. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7685.  
  7686. play_note(n_midi);
  7687. QColor c=liste_couleurs[3];
  7688. dessine_1_note(1, 11, c); dessine_1_note(2, 16, c);
  7689. set_couleur_label(c, label4_4);
  7690. }
  7691.  
  7692. void MW::on_Bt_E6_clicked()
  7693. {
  7694. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7695. int n_midi=76;
  7696. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7697.  
  7698. play_note(n_midi);
  7699. QColor c=liste_couleurs[4];
  7700. dessine_1_note(1, 12, c); dessine_1_note(2, 17, c);
  7701. set_couleur_label(c, label5_4);
  7702. }
  7703.  
  7704. void MW::on_Bt_F6_clicked()
  7705. {
  7706. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7707. int n_midi=77;
  7708. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7709.  
  7710. play_note(n_midi);
  7711. QColor c=liste_couleurs[5];
  7712. dessine_1_note(1, 13, c); dessine_1_note(2, 18, c);
  7713. set_couleur_label(c, label6_4);
  7714. }
  7715.  
  7716. void MW::on_Bt_Fd6_clicked()
  7717. {
  7718. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7719. int n_midi=78;
  7720. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7721.  
  7722. play_note(n_midi);
  7723. QColor c=liste_couleurs[6];
  7724. dessine_1_note(1, 14, c); dessine_1_note(2, 19, c);
  7725. set_couleur_label(c, label7_4);
  7726. }
  7727.  
  7728. void MW::on_Bt_G6_clicked()
  7729. {
  7730. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7731. int n_midi=79;
  7732. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7733.  
  7734. play_note(n_midi);
  7735. QColor c=liste_couleurs[7];
  7736. dessine_1_note(1, 15, c); dessine_1_note(2, 20, c);
  7737. set_couleur_label(c, label8_4);
  7738. }
  7739.  
  7740. void MW::on_Bt_Gd6_clicked()
  7741. {
  7742. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7743. int n_midi=80;
  7744. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7745.  
  7746. play_note(n_midi);
  7747. QColor c=liste_couleurs[8];
  7748. dessine_1_note(1, 16, c);
  7749. set_couleur_label(c, label9_4);
  7750. }
  7751.  
  7752. void MW::on_Bt_A6_clicked()
  7753. {
  7754. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7755. int n_midi=81;
  7756. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7757.  
  7758. play_note(n_midi);
  7759. QColor c=liste_couleurs[9];
  7760. dessine_1_note(1, 17, c);
  7761. set_couleur_label(c, label10_4);
  7762. }
  7763.  
  7764. void MW::on_Bt_Bb6_clicked()
  7765. {
  7766. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7767. int n_midi=82;
  7768. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7769.  
  7770. play_note(n_midi);
  7771. QColor c=liste_couleurs[10];
  7772. dessine_1_note(1, 18, c);
  7773. set_couleur_label(c, label11_4);
  7774. }
  7775.  
  7776.  
  7777. void MW::on_Bt_B6_clicked()
  7778. {
  7779. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7780. int n_midi=83;
  7781. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7782.  
  7783. play_note(n_midi);
  7784. QColor c=liste_couleurs[11];
  7785. dessine_1_note(1, 19, c);
  7786. set_couleur_label(c, label12_4);
  7787. }
  7788.  
  7789.  
  7790. void MW::on_Bt_C7_clicked()
  7791. {
  7792. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7793. int n_midi=84;
  7794. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7795.  
  7796. play_note(n_midi);
  7797. QColor c=liste_couleurs[0];
  7798. dessine_1_note(1, 20, c);
  7799. //set_couleur_label(c, label13_4);
  7800. }
  7801.  
  7802.  
  7803. void MW::on_Bt_Cd7_clicked()
  7804. {
  7805. if(CB_dess1seuleNote->isChecked()) { effacer_calque(scene_manche, calque_notes_manche); }
  7806. int n_midi=85;
  7807. if(CB_saisie_au_clavier->isChecked()) {saisie_clavier(n_midi);}
  7808.  
  7809. play_note(n_midi);
  7810. QColor c=liste_couleurs[1];
  7811. dessine_1_note(1, 21, c);
  7812. }
  7813.  
  7814.  
  7815. void MW::effacer_touches()
  7816. {
  7817. QColor c = "#505050";
  7818. set_couleur_label(c, label5);
  7819. set_couleur_label(c, label6);
  7820. set_couleur_label(c, label7);
  7821. set_couleur_label(c, label8);
  7822. set_couleur_label(c, label9);
  7823. set_couleur_label(c, label10);
  7824. set_couleur_label(c, label11);
  7825. set_couleur_label(c, label12);
  7826.  
  7827. set_couleur_label(c, label1_2);
  7828. set_couleur_label(c, label2_2);
  7829. set_couleur_label(c, label3_2);
  7830. set_couleur_label(c, label4_2);
  7831. set_couleur_label(c, label5_2);
  7832. set_couleur_label(c, label6_2);
  7833. set_couleur_label(c, label7_2);
  7834. set_couleur_label(c, label8_2);
  7835. set_couleur_label(c, label9_2);
  7836. set_couleur_label(c, label10_2);
  7837. set_couleur_label(c, label11_2);
  7838. set_couleur_label(c, label12_2);
  7839.  
  7840. set_couleur_label(c, label1_3);
  7841. set_couleur_label(c, label2_3);
  7842. set_couleur_label(c, label3_3);
  7843. set_couleur_label(c, label4_3);
  7844. set_couleur_label(c, label5_3);
  7845. set_couleur_label(c, label6_3);
  7846. set_couleur_label(c, label7_3);
  7847. set_couleur_label(c, label8_3);
  7848. set_couleur_label(c, label9_3);
  7849. set_couleur_label(c, label10_3);
  7850. set_couleur_label(c, label11_3);
  7851. set_couleur_label(c, label12_3);
  7852.  
  7853. set_couleur_label(c, label1_4);
  7854. set_couleur_label(c, label2_4);
  7855. set_couleur_label(c, label3_4);
  7856. set_couleur_label(c, label4_4);
  7857. set_couleur_label(c, label5_4);
  7858. set_couleur_label(c, label6_4);
  7859. set_couleur_label(c, label7_4);
  7860. set_couleur_label(c, label8_4);
  7861. set_couleur_label(c, label9_4);
  7862. set_couleur_label(c, label10_4);
  7863. set_couleur_label(c, label11_4);
  7864. set_couleur_label(c, label12_4);
  7865.  
  7866. }
  7867.  
  7868.  
  7869.  
  7870. void MW::on_Bt_RAZ_2_clicked()
  7871. {
  7872. // sur le manche
  7873. effacer_calque(scene_manche, calque_notes_manche);
  7874. // effacer_calque(scene1, calque_encadrement);
  7875. // Frame_wWidget1->setVisible(false);
  7876.  
  7877. // la suite sur les touches
  7878. effacer_touches();
  7879.  
  7880. // LBL_corde->setText("-");
  7881. // LBL_case->setText("-");
  7882. }
  7883.  
  7884.  
  7885. void MW::create_100_lignes_V()
  7886. {
  7887. for (int n=0; n<100; n++)
  7888. {
  7889. lst_frames.append(new QFrame(this)); // this
  7890. lst_frames[n]->setGeometry(0, 0, 1, 1);
  7891. //lst_frames[n]->setStyleSheet(QString::fromUtf8("background-color: rgb(0, 0, 0);"));
  7892. lst_frames[n]->setStyleSheet("background-color: blue");
  7893.  
  7894. lst_frames[n]->hide();
  7895. }
  7896. }
  7897.  
  7898.  
  7899. void MW::efface_lst_frames()
  7900. {
  7901. for (int n=0; n<100; n++)
  7902. {
  7903. lst_frames[n]->hide();
  7904. }
  7905. }
  7906.  
  7907.  
  7908. void MW::trace_rectangle1(int x, int y, int dx, int dy)
  7909. {
  7910. lst_frames[1]->setGeometry(QRect(x, y, dx, 2)); lst_frames[1]->show();
  7911. lst_frames[2]->setGeometry(QRect(x, y+dy, dx, 2)); lst_frames[2]->show();
  7912.  
  7913. lst_frames[3]->setGeometry(QRect(x, y, 2, dy)); lst_frames[3]->show();
  7914. lst_frames[4]->setGeometry(QRect(x+dx, y, 2, dy)); lst_frames[4]->show();
  7915. }
  7916.  
  7917.  
  7918. void MW::encadrement_ligne() // du tableWidget_3
  7919. {
  7920. int x0=TW_3->x();
  7921. int y0=TW_3->y() + 70;
  7922. int y_max = y0 + TW_3->height();
  7923.  
  7924. int x, y;
  7925. int largeur = TW_3->width()-10;
  7926. int HL = TW_3->verticalHeader()->defaultSectionSize();
  7927. int V_SB;
  7928. int V_diff;
  7929.  
  7930.  
  7931. // encadrement de la ligne sélectionnée
  7932. int num_ligne = TW_3->currentRow();
  7933. QScrollBar *V_Scroll = TW_3->verticalScrollBar();
  7934.  
  7935. V_SB = V_Scroll->value();
  7936. V_diff = num_ligne - V_SB;
  7937.  
  7938. x = x0;
  7939. y = y0 + HL * V_diff;
  7940.  
  7941. if ((V_diff>=0) && (y < y_max - HL))
  7942. {
  7943. trace_rectangle1(x, y, largeur, HL);
  7944. }
  7945. else { trace_rectangle1(x,y, 1, 1); }
  7946. }
  7947.  
  7948.  
  7949. void MW::TW_3_scroll(int H)
  7950. {
  7951. //write_Time_line();
  7952. encadrement_ligne();
  7953. }
  7954.  
  7955.  
  7956. void MW::encadre_accord(int case1, int case2)
  7957. {
  7958. int x0, y0, x1, y1, dx, dy;
  7959.  
  7960. effacer_calque(scene_manche, calque_encadrement3);
  7961.  
  7962. if (case1>19) {return;}
  7963. if (case2>20) {return;}
  7964. if (case1>case2) {return;}
  7965.  
  7966. if((case1==0) && (case2==20))
  7967. {
  7968. Frame_wWidget1->setVisible(false);
  7969. return;
  7970. }
  7971.  
  7972. calcul_xy_note(1, case1, &x0, &y0);
  7973. calcul_xy_note(6, case2, &x1, &y1);
  7974. dx= x1-x0;
  7975. dy=y1-y0;
  7976.  
  7977. Frame_wWidget1->setGeometry(QRect(x0-4, y0-2, dx+24, dy +14));
  7978. Frame_wWidget1->setStyleSheet( "background: transparent;" "border: 1px solid yellow;" "border-radius: 15px;" );
  7979. QGraphicsProxyWidget *proxy = scene_manche->addWidget(Frame_wWidget1);
  7980. Frame_wWidget1->setVisible(true);
  7981. }
  7982.  
  7983.  
  7984. void MW::on_Bt_ACCORD_1_clicked() // accord majeur
  7985. {
  7986. // en Do ça donne C E G (do mi sol)
  7987.  
  7988. CB_dess1seuleNote->setChecked(false);
  7989. on_Bt_RAZ_2_clicked();
  7990. LBL_corde->setText("-");
  7991. LBL_case->setText("-");
  7992.  
  7993. checkBox_not_erase->setChecked(true);
  7994.  
  7995. QString s1, s2, s3, s4;
  7996. int d = SBX_tonique->value();
  7997.  
  7998. s1 = gamme_chromatique_d[d];
  7999. s2=" ";
  8000. s1+=s2;
  8001. LE_accord_name->setText(s1);
  8002. LB_accord_name->setText(s1);
  8003.  
  8004. case_min = SBX_de->value(); s3.setNum(case_min);
  8005. case_max = SBX_a->value(); s4.setNum(case_max);
  8006. LE_de_a->setText(s3 + "a" +s4);
  8007.  
  8008. //LB_accord_name->clear();
  8009. encadre_accord(case_min, case_max);
  8010.  
  8011. //on_Bt_RAZ_clicked();
  8012. execute_note_midi(28 + SBX_tonique->value());
  8013. execute_note_midi(31 + SBX_tonique->value());
  8014. execute_note_midi(36 + SBX_tonique->value());
  8015.  
  8016. execute_note_midi(28+12 + SBX_tonique->value());
  8017. execute_note_midi(31+12 + SBX_tonique->value());
  8018. execute_note_midi(36+12 + SBX_tonique->value());
  8019.  
  8020. execute_note_midi(28+12+12 + SBX_tonique->value());
  8021. execute_note_midi(31+12+12 + SBX_tonique->value());
  8022. execute_note_midi(36+12+12 + SBX_tonique->value());
  8023.  
  8024. execute_note_midi(28+12+12+12 + SBX_tonique->value());
  8025. execute_note_midi(31+12+12+12 + SBX_tonique->value());
  8026. execute_note_midi(36+12+12+12 + SBX_tonique->value());
  8027.  
  8028. type_accords = 1;
  8029. }
  8030.  
  8031.  
  8032. void MW::on_Bt_ACCORD_2_clicked()// accord mineur
  8033. {
  8034. // en Do ça donne C Eb G (do mi-bémol sol)
  8035.  
  8036. CB_dess1seuleNote->setChecked(false);
  8037. //effacer_calque(scene1, calque_notes_manche);
  8038. on_Bt_RAZ_2_clicked();
  8039. LBL_corde->setText("-");
  8040. LBL_case->setText("-");
  8041.  
  8042. checkBox_not_erase->setChecked(true);
  8043.  
  8044. QString s1, s2, s3, s4;
  8045. int d = SBX_tonique->value();
  8046.  
  8047. s1 = gamme_chromatique_d[d];
  8048. s2="m";
  8049. s1+=s2;
  8050. LE_accord_name->setText(s1);
  8051. LB_accord_name->setText(s1);
  8052.  
  8053. case_min = SBX_de->value(); s3.setNum(case_min);
  8054. case_max = SBX_a->value(); s4.setNum(case_max);
  8055. LE_de_a->setText(s3 + "a" +s4);
  8056.  
  8057. //LB_accord_name->clear();
  8058. encadre_accord(case_min, case_max);
  8059.  
  8060. //on_Bt_RAZ_clicked();
  8061. execute_note_midi( 31 + SBX_tonique->value());
  8062. execute_note_midi( 36 + SBX_tonique->value());
  8063. execute_note_midi( 39 + SBX_tonique->value());
  8064.  
  8065. execute_note_midi( 31+12 + SBX_tonique->value());
  8066. execute_note_midi( 36+12 + SBX_tonique->value());
  8067. execute_note_midi( 39+12 + SBX_tonique->value());
  8068.  
  8069. execute_note_midi( 31+12+12 + SBX_tonique->value());
  8070. execute_note_midi( 36+12+12 + SBX_tonique->value());
  8071. execute_note_midi( 39+12+12 + SBX_tonique->value());
  8072.  
  8073. execute_note_midi( 31+12+12+12 + SBX_tonique->value());
  8074. execute_note_midi( 36+12+12+12 + SBX_tonique->value());
  8075. execute_note_midi( 39+12+12+12 + SBX_tonique->value());
  8076.  
  8077. type_accords = 2;
  8078. }
  8079.  
  8080. void MW::on_Bt_ACCORD_3_clicked()// accord 7eme de dominante
  8081. {
  8082. // en Do ça donne C E G Bb (do mi sol si-bémol)
  8083.  
  8084. CB_dess1seuleNote->setChecked(false);
  8085. //effacer_calque(scene1, calque_notes_manche);
  8086. on_Bt_RAZ_2_clicked();
  8087. LBL_corde->setText("-");
  8088. LBL_case->setText("-");
  8089. checkBox_not_erase->setChecked(true);
  8090.  
  8091. QString s1, s2, s3, s4;
  8092. int d = SBX_tonique->value();
  8093.  
  8094. s1 = gamme_chromatique_d[d];
  8095. s2="7d";
  8096. s1+=s2;
  8097. LE_accord_name->setText(s1);
  8098. LB_accord_name->setText(s1);
  8099.  
  8100. case_min = SBX_de->value(); s3.setNum(case_min);
  8101. case_max = SBX_a->value(); s4.setNum(case_max);
  8102. LE_de_a->setText(s3 + "a" +s4);
  8103.  
  8104. //LB_accord_name->clear();
  8105. encadre_accord(case_min, case_max);
  8106.  
  8107. //on_Bt_RAZ_clicked();
  8108. execute_note_midi( 36 + SBX_tonique->value());
  8109. execute_note_midi( 40 + SBX_tonique->value());
  8110. execute_note_midi( 43 + SBX_tonique->value());
  8111. execute_note_midi( 58 + SBX_tonique->value());
  8112.  
  8113. execute_note_midi( 36+12 + SBX_tonique->value());
  8114. execute_note_midi( 40+12 + SBX_tonique->value());
  8115. execute_note_midi( 43+12 + SBX_tonique->value());
  8116. execute_note_midi( 58+12 + SBX_tonique->value());
  8117.  
  8118. execute_note_midi( 36+12+12 + SBX_tonique->value());
  8119. execute_note_midi( 40+12+12 + SBX_tonique->value());
  8120. execute_note_midi( 43+12+12 + SBX_tonique->value());
  8121. execute_note_midi( 58+12+12 + SBX_tonique->value());
  8122.  
  8123. execute_note_midi( 36+12+12+12 + SBX_tonique->value());
  8124. execute_note_midi( 40+12+12+12 + SBX_tonique->value());
  8125. execute_note_midi( 43+12+12+12 + SBX_tonique->value());
  8126. execute_note_midi( 58+12+12+12 + SBX_tonique->value());
  8127.  
  8128. type_accords = 3;
  8129. }
  8130.  
  8131.  
  8132. void MW::on_Bt_ACCORD_4_clicked()// accord maj7
  8133. {
  8134. // en Do ça donne C E G B (do mi sol si)
  8135.  
  8136. CB_dess1seuleNote->setChecked(false);
  8137. //effacer_calque(scene1, calque_notes_manche);
  8138. on_Bt_RAZ_2_clicked();
  8139. LBL_corde->setText("-");
  8140. LBL_case->setText("-");
  8141.  
  8142. checkBox_not_erase->setChecked(true);
  8143.  
  8144. QString s1, s2, s3, s4;
  8145. int d = SBX_tonique->value();
  8146.  
  8147. s1 = gamme_chromatique_d[d];
  8148. s2="M7";
  8149. s1+=s2;
  8150. LE_accord_name->setText(s1);
  8151. LB_accord_name->setText(s1);
  8152.  
  8153. case_min = SBX_de->value(); s3.setNum(case_min);
  8154. case_max = SBX_a->value(); s4.setNum(case_max);
  8155. LE_de_a->setText(s3 + "a" +s4);
  8156.  
  8157. //LB_accord_name->clear();
  8158. encadre_accord(case_min, case_max);
  8159.  
  8160. execute_note_midi(28 + SBX_tonique->value());
  8161. execute_note_midi(31 + SBX_tonique->value());
  8162. execute_note_midi(35 + SBX_tonique->value());
  8163. execute_note_midi(36 + SBX_tonique->value());
  8164.  
  8165. execute_note_midi(28+12 + SBX_tonique->value());
  8166. execute_note_midi(31+12 + SBX_tonique->value());
  8167. execute_note_midi(35+12 + SBX_tonique->value());
  8168. execute_note_midi(36+12 + SBX_tonique->value());
  8169.  
  8170. execute_note_midi(28+12+12 + SBX_tonique->value());
  8171. execute_note_midi(31+12+12 + SBX_tonique->value());
  8172. execute_note_midi(35+12+12 + SBX_tonique->value());
  8173. execute_note_midi(36+12+12 + SBX_tonique->value());
  8174.  
  8175. execute_note_midi(28+12+12+12 + SBX_tonique->value());
  8176. execute_note_midi(31+12+12+12 + SBX_tonique->value());
  8177. execute_note_midi(35+12+12+12 + SBX_tonique->value());
  8178. execute_note_midi(36+12+12+12 + SBX_tonique->value());
  8179.  
  8180. type_accords = 4;
  8181. }
  8182.  
  8183.  
  8184. void MW::on_Bt_ACCORD_5_clicked()// accord min7
  8185. {
  8186. // en Do ça donne C Eb G Bb (do mi-bemol sol si-bemol)
  8187.  
  8188. CB_dess1seuleNote->setChecked(false);
  8189. //effacer_calque(scene1, calque_notes_manche);
  8190. on_Bt_RAZ_2_clicked();
  8191. LBL_corde->setText("-");
  8192. LBL_case->setText("-");
  8193.  
  8194. checkBox_not_erase->setChecked(true);
  8195.  
  8196. QString s1, s2, s3, s4;
  8197. int d = SBX_tonique->value();
  8198.  
  8199. s1 = gamme_chromatique_d[d];
  8200. s2="m7";
  8201. s1+=s2;
  8202. LE_accord_name->setText(s1);
  8203. LB_accord_name->setText(s1);
  8204.  
  8205. case_min = SBX_de->value(); s3.setNum(case_min);
  8206. case_max = SBX_a->value(); s4.setNum(case_max);
  8207. LE_de_a->setText(s3 + "a" +s4);
  8208.  
  8209. //LB_accord_name->clear();
  8210. encadre_accord(case_min, case_max);
  8211.  
  8212. execute_note_midi(27 + SBX_tonique->value());
  8213. execute_note_midi(31 + SBX_tonique->value());
  8214. execute_note_midi(34 + SBX_tonique->value());
  8215. execute_note_midi(36 + SBX_tonique->value());
  8216.  
  8217. execute_note_midi(27+12 + SBX_tonique->value());
  8218. execute_note_midi(31+12 + SBX_tonique->value());
  8219. execute_note_midi(34+12 + SBX_tonique->value());
  8220. execute_note_midi(36+12 + SBX_tonique->value());
  8221.  
  8222. execute_note_midi(27+12+12 + SBX_tonique->value());
  8223. execute_note_midi(31+12+12 + SBX_tonique->value());
  8224. execute_note_midi(34+12+12 + SBX_tonique->value());
  8225. execute_note_midi(36+12+12 + SBX_tonique->value());
  8226.  
  8227. execute_note_midi(27+12+12+12 + SBX_tonique->value());
  8228. execute_note_midi(31+12+12+12 + SBX_tonique->value());
  8229. execute_note_midi(34+12+12+12 + SBX_tonique->value());
  8230. execute_note_midi(36+12+12+12 + SBX_tonique->value());
  8231.  
  8232. type_accords = 5;
  8233.  
  8234. }
  8235.  
  8236.  
  8237.  
  8238.  
  8239. void MW::joue_accord_complet(QString ACC, QString cases)
  8240. {
  8241. // exemple: (Sol, 3a5) -> c.a.d case 3 à case 5
  8242. QString s1, s2b, s2c, s3, s4;
  8243. QString sN, sT;
  8244. //QString degré_txt;
  8245. QString type;
  8246. int p1, p2;
  8247. s1 = ACC; // exemples : Sim, Sibm, Do, Dom, La, Lam, Sol, Solm, Mi7
  8248.  
  8249. // if (!checkBox_not_erase->isChecked()) {on_Bt_RAZ_clicked();}
  8250.  
  8251. if ((ACC == "") || (ACC == " ") ) { return; }
  8252.  
  8253. /*
  8254. // ACCORD TYPE // exemples: [Sol#](M7) , [Do#](7d) , [Fa](m)
  8255. s1 "[La]()" La accord majeur 'ordinaire'
  8256. s1 "[Fa#]()" Fa dièze
  8257. s1 "[Mi](7d)" Mi 7eme de dominante
  8258. s1 "[Si](m)" Si mineur
  8259. s1 "[Sib](m)" Si bémol mineur
  8260. s1 "[Do]()" Do majeur 'ordinaire'
  8261. s1 "[Sol](M7)" Sol
  8262. s1 "[Fa#](m7)" Mi dièze 7eme mineure...
  8263. */
  8264.  
  8265. // détection du degré (0 pour Do , à 11 pour Si)
  8266. // rappel : gamme_chromatique<<"Do"<<"Do#"<<"Ré"<<"Mib"<<"Mi"<<"Fa"<<"Fa#"<<"Sol"<<"Sol#"<<"La"<<"Sib"<<"Si";
  8267. // ou : gamme_chromatique<<"Do"<<"Do#"<<"Ré"<<"Ré#"<<"Mi"<<"Fa"<<"Fa#"<<"Sol"<<"Sol#"<<"La"<<"La#<<"Si";
  8268.  
  8269. int n=11;
  8270. int deg = -1;
  8271. bool ok = false;
  8272.  
  8273. while ((n>0) && (ok == false))
  8274. {
  8275. QString s2a = gamme_chromatique_d[n];
  8276. p1 = s1.indexOf(s2a);
  8277. if (p1 != -1) {ok = true;}
  8278. n--;
  8279. }
  8280. if (ok == true) {deg = n+1; }
  8281.  
  8282. //nom de la note tonique
  8283. p1 = s1.indexOf("[");
  8284. p2 = s1.indexOf("]");
  8285. if ((p1!=-1)&&(p2!=-1))
  8286. {
  8287. sN = s1.mid(p1+1, p2-p1-1);
  8288. }
  8289.  
  8290. //traitement altérations
  8291. if ( sN.contains("b")) {deg --;}
  8292. if ( sN.contains("#")) {deg ++;}
  8293.  
  8294. //type d'accord
  8295. p1 = s1.indexOf("(");
  8296. p2 = s1.indexOf(")");
  8297. if ((p1!=-1)&&(p2!=-1))
  8298. {
  8299. sT = s1.mid(p1+1, p2-p1-1);
  8300. }
  8301.  
  8302. // s2b = ACC.right(2); // m, 7, mais aussi # ou la dernière lettre du nom de la note !
  8303.  
  8304. // intervalle de cases à jouer :
  8305.  
  8306. s2c = cases; // "0a3" ou "12a14" ...
  8307. p2=s2c.indexOf("a");
  8308.  
  8309. if (p2 != -1)
  8310. {
  8311. s3=s2c.left(p2);
  8312. case_min = s3.toInt();
  8313. SBX_de->setValue(case_min);
  8314.  
  8315. s4 = s2c.mid(p2+1, 255);
  8316. int v4 = s4.toInt();
  8317.  
  8318. if (v4 >= case_min) // on accepte une case unique (genre "7a7") pour forcer une note unique à sa place
  8319. {
  8320. case_max = v4; // ici on enregistre le numero de la case max
  8321. SBX_a->setValue(case_max);
  8322. }
  8323. }
  8324.  
  8325. else
  8326. {
  8327. case_min = 0;
  8328. SBX_de->setValue(case_min);
  8329. case_max = 20; // numéro de la case
  8330. SBX_a->setValue(case_max); // nombre de cases
  8331. }
  8332.  
  8333. notes_pleines = false; // ne représentera qu'un cercle
  8334.  
  8335. if (sT=="") // accord majeur
  8336. {
  8337. SBX_tonique->setValue(deg); // spinBox dans le cadre 'Configurateur d'Accords'
  8338. on_Bt_ACCORD_1_clicked();
  8339. }
  8340.  
  8341. if (sT=="m") // accord mineur
  8342. {
  8343. SBX_tonique->setValue(deg);
  8344. on_Bt_ACCORD_2_clicked();
  8345. }
  8346.  
  8347. if (sT=="7d") // 7eme de dominante
  8348. {
  8349. SBX_tonique->setValue(deg);
  8350. on_Bt_ACCORD_3_clicked();
  8351. }
  8352.  
  8353. if (sT=="M7") // majeur 7
  8354. {
  8355. SBX_tonique->setValue(deg);
  8356. on_Bt_ACCORD_4_clicked();
  8357. }
  8358.  
  8359.  
  8360. if (sT=="m7") // mineur 7
  8361. {
  8362. SBX_tonique->setValue(deg);
  8363. on_Bt_ACCORD_5_clicked();
  8364. }
  8365.  
  8366. if (sT=="-") // note seule
  8367. {
  8368. // SB_tonique->setValue(D);
  8369. // on_Bt_ACCORD_3_clicked();
  8370. on_Bt_RAZ_clicked();
  8371. }
  8372.  
  8373. /*
  8374.   case_min = 0;
  8375.   SBX_de->setValue(case_min);
  8376.   case_max = 20;
  8377.   SBX_a->setValue(case_max);
  8378. */
  8379. notes_pleines = true;
  8380.  
  8381. s1 = type;
  8382. if (s1 == "dom") {s1 = "7e dom";}
  8383. label_43->setText(LE_tonique->text() + " " +s1);
  8384. }
  8385.  
  8386.  
  8387. void MW::joue_1_ligne(int ligne_i)
  8388. {
  8389. QString s1;
  8390.  
  8391. for(int C=1; C<5; C++)
  8392. {
  8393. //on_Bt_RAZ_clicked();
  8394. s1 = TW_3->item(ligne_i, C)->text();
  8395. s1 = s1.left(3);
  8396. int m1 = s1.toInt();
  8397. execute_note_midi(m1);
  8398. }
  8399. }
  8400.  
  8401.  
  8402. void MW::trace_ligne_V(int num_colonne, int num_mesure)
  8403. {
  8404. //sur le tableau horizontal (TimeLine)
  8405.  
  8406. if (num_mesure >=100) {return;} // nb max de lignes instanciées, voir fonction ci-dessus
  8407.  
  8408. int x;
  8409. int dy=140;
  8410. int LC=10; // largeur colonnes
  8411. int H_diff;
  8412. int x0=TW_TimeLine->x();
  8413. int y0=TW_TimeLine->y();
  8414.  
  8415.  
  8416. if (zoom==1) {LC=10;}
  8417. if (zoom==2) {LC=20;}
  8418.  
  8419. QScrollBar *H_Scroll = TW_TimeLine->horizontalScrollBar();
  8420.  
  8421. H_diff = num_colonne - H_Scroll->value();
  8422. x = x0 + LC * H_diff;
  8423.  
  8424. if (H_diff>=0)
  8425. {
  8426. lst_frames[num_mesure+8]->setGeometry(QRect(x, y0, 2, dy));
  8427. lst_frames[num_mesure+8]->setStyleSheet("background-color: gray");
  8428. lst_frames[num_mesure+8]->show();
  8429. }
  8430. }
  8431.  
  8432.  
  8433. void MW::write_Time_line()
  8434. {
  8435.  
  8436. int m1;
  8437. int R;
  8438. QColor couleur1;
  8439. int duree_note, intervalle_t, Ti1, Ti2, numero_mesure;
  8440. QString s1, s2, s3, sm;
  8441. intervalle_t=0;
  8442. Ti1=0;
  8443.  
  8444. int Rmax= TW_3->rowCount();
  8445. if (Rmax > 1000) {Rmax =1000;} // évite de saturer sur des morceaux trops longs !
  8446.  
  8447. // ------------- colorie les cases horizontales (notes) ---------------------------
  8448. Ti2=0;
  8449.  
  8450. R=0;
  8451. while ((R < Rmax) && Ti2 < 300)
  8452. {
  8453. s1 = TW_3->item(R, 7)->text();
  8454. duree_note = s1.toInt();
  8455.  
  8456. for (int dt=0; dt<duree_note; dt++)
  8457. {
  8458. s1 = TW_3->item(R, 1)->text();
  8459. s1 = s1.left(2);
  8460. m1 = s1.toInt();
  8461. if ((m1 >= 40) && (m1 <= 84)) // si présence d'un code midi
  8462. {
  8463. couleur1 = TW_3->item(R, 1)->background().color();
  8464. if(couleur1 != "#000000") { complete_case(1, Ti2, " ", "#CECECE", couleur1, false, TW_TimeLine);}
  8465. }
  8466.  
  8467. s1 = TW_3->item(R, 2)->text();
  8468. s1 = s1.left(2);
  8469. m1 = s1.toInt();
  8470.  
  8471. if ((m1 >= 40) && (m1 <= 84))
  8472. {
  8473. couleur1 = TW_3->item(R, 2)->background().color();
  8474. if(couleur1 != "#000000") { complete_case(2, Ti2, " ", "#CECECE", couleur1, false, TW_TimeLine);}
  8475. }
  8476.  
  8477. s1 = TW_3->item(R, 3)->text();
  8478. s1 = s1.left(2);
  8479. m1 = s1.toInt();
  8480. if ((m1 >= 40) && (m1 <= 84))
  8481. {
  8482. couleur1 = TW_3->item(R, 3)->background().color();
  8483. if(couleur1 != "#000000") { complete_case(3, Ti2, " ", "#CECECE", couleur1, false, TW_TimeLine);}
  8484. }
  8485.  
  8486. s1 = TW_3->item(R, 4)->text();
  8487. s1 = s1.left(2);
  8488. m1 = s1.toInt();
  8489. if ((m1 >= 40) && (m1 <= 84))
  8490. {
  8491. couleur1 = TW_3->item(R, 4)->background().color();
  8492. if(couleur1 != "#000000") {complete_case(4, Ti2, " ", "#CECECE", couleur1, false, TW_TimeLine);}
  8493. }
  8494. Ti2 ++;
  8495. }
  8496. R++;
  8497. }
  8498. // ----------------------------------------
  8499. numero_mesure =1; // DEPART
  8500.  
  8501. R=0;
  8502. while ((R < Rmax) && Ti1 < 300)
  8503. {
  8504. sm =TW_3->item(R, 7)->text();
  8505.  
  8506. couleur1 = TW_3->item(R, 8)->background().color();
  8507. if(couleur1 == "#888888")
  8508. {
  8509. s2.setNum(intervalle_t);
  8510.  
  8511. complete_case(0, Ti1-1, s2, "#000000", "#FFFFFF", false, TW_TimeLine);
  8512. intervalle_t=0;
  8513.  
  8514. s3.setNum(numero_mesure);
  8515. complete_case(0, Ti1, s3, "#FFFFFF", "#555555", false, TW_TimeLine);
  8516.  
  8517. trace_ligne_V(Ti1, numero_mesure);
  8518. s1 = TW_3->item(R, 6)->text();
  8519. duree_note = s1.toInt();
  8520. intervalle_t += duree_note;
  8521. Ti1 += duree_note;
  8522. numero_mesure++;
  8523. }
  8524. else
  8525. {
  8526. s1 = TW_3->item(R, 6)->text(); // durée de la note
  8527. duree_note = s1.toInt();
  8528. intervalle_t += duree_note;
  8529. Ti1 += duree_note;
  8530. }
  8531. R++;
  8532. }
  8533. }
  8534.  
  8535.  
  8536. int MW::calcul_T_note(int R)
  8537. {
  8538. // temps du début de la note en fonction du num de ligne (row) de la cellule cliquée dans le tableau3
  8539. int i, di, dT;
  8540. QString s1, duree_txt;
  8541.  
  8542. dT=0;
  8543. for(i=0 ; i<R ; i++)
  8544. {
  8545. duree_txt = TW_3->item(i, 6)->text();
  8546. di = duree_txt.toInt();
  8547. dT += di;
  8548. }
  8549. return dT;
  8550. }
  8551.  
  8552.  
  8553. void MW::trace_rectangle2(int x, int y, int dx, int dy)
  8554. {
  8555. // l'objet QRect doit s'utiliser sur un QPainter
  8556. // d'où cette fonction qui trace directement sur le mainwindow
  8557. // sans masquage du fond (ne confisque pas les clics souris sur les widgets en particulier !!!)
  8558. lst_frames[5]->setGeometry(QRect(x, y, dx, 2)); lst_frames[5]->show();
  8559. lst_frames[6]->setGeometry(QRect(x, y+dy, dx, 2)); lst_frames[6]->show();
  8560.  
  8561. lst_frames[7]->setGeometry(QRect(x, y, 2, dy)); lst_frames[7]->show();
  8562. lst_frames[8]->setGeometry(QRect(x+dx, y, 2, dy)); lst_frames[8]->show();
  8563. }
  8564.  
  8565.  
  8566. void MW::encadrement_colonne() // de la timeline en bas (tableWidget_T sur onglet 'INSTRUMENTS')
  8567. {
  8568. int x0=TW_TimeLine->x();
  8569. int y0=TW_TimeLine->y() + 45;
  8570. int x;
  8571. int dx;
  8572. int dy=120; //tableWidget_T->height();
  8573. int LC=10; // largeur colonnes, doit coincider avec la valeur inscrite dans l'ui
  8574. int HSB;
  8575. int H_diff;
  8576.  
  8577. //num_colonne_a_encadrer=5;
  8578. //nb_colonnes_a_encadrer=3;
  8579.  
  8580. if (zoom==1) {LC=10;}
  8581. if (zoom==2) {LC=20;}
  8582. // nb_colonnes_a_encadrer -> variable globale
  8583.  
  8584. QScrollBar *H_Scroll = TW_TimeLine->horizontalScrollBar();
  8585.  
  8586. HSB = H_Scroll->value();
  8587. H_diff = num_colonne_a_encadrer - HSB;
  8588.  
  8589. x = x0 + LC * H_diff;
  8590. dx = LC * nb_colonnes_a_encadrer;
  8591.  
  8592. if (H_diff>=0)
  8593. {
  8594. trace_rectangle2(x, y0, dx, dy);
  8595. }
  8596. else
  8597. {
  8598. ;
  8599. }
  8600. }
  8601.  
  8602.  
  8603. void MW::garnir_TW3()
  8604. {
  8605. // avec la liste_NOTES
  8606.  
  8607. NOTE note1, note2;
  8608.  
  8609. int n_barre1, n_barre2;
  8610. int duree;
  8611. int midi_i;
  8612. int num_case=0;
  8613. int num_ligne=0;
  8614.  
  8615. QString s1;
  8616. QString nom_note;
  8617. QString duree_txt;
  8618. //uint32_t t=0;
  8619.  
  8620. int n_max = liste_NOTES.length();
  8621. if(n_max<2) {return;} // évite d'effacer TW3 intempestivement
  8622.  
  8623. init_TW_3();
  8624. TW_3->setRowCount(0);
  8625. on_Bt_AddLine_clicked();
  8626.  
  8627. // premier passage: on remplit le tableau avec des lignes vides
  8628. for(int n=0; n<n_max; n++)
  8629. {
  8630. int RC = TW_3->rowCount();
  8631. TW_3->setRowCount(RC+1); // ajout une ligne au tableau
  8632. for (int c=0; c<=13; c++)
  8633. {
  8634. complete_case(RC, c, "", "#000000", "#FFFFFF", false, TW_3);
  8635. }
  8636. }
  8637.  
  8638. // second passage:
  8639. num_ligne++;
  8640. for(int n=0; n<n_max; n++)
  8641. {
  8642. note1 = liste_NOTES[n-1];
  8643. note2 = liste_NOTES[n];
  8644.  
  8645. n_barre1 = note1.n_barreM;
  8646. n_barre2 = note2.n_barreM;
  8647.  
  8648. midi_i = note2.midi;
  8649.  
  8650.  
  8651. if (n_barre2 != n_barre1) { num_ligne++; }
  8652.  
  8653. nom_note="";
  8654. if ((midi_i >=40) && (midi_i <=84) )
  8655. {
  8656. nom_note.setNum(midi_i);
  8657. int h1 = calcul_hauteur_note(midi_i);
  8658. QColor couleur1 = liste_couleurs[h1];
  8659. nom_note+=" ";
  8660. nom_note += nom_note_FR(midi_i);
  8661.  
  8662. //num_case=0;
  8663. int RC = TW_3->rowCount();
  8664.  
  8665. QString s0="";
  8666. if (num_ligne >1) {s0 = TW_3->item(num_ligne-1, 0)->text(); }
  8667. s1.setNum(n);
  8668. s1 = s0 + " " + s1;
  8669.  
  8670. complete_case(num_ligne-1, 0, s1, "#000000", "#DDDDDD", false, TW_3);
  8671. for (int c=0; c<=13; c++)
  8672. {
  8673. complete_case(RC, c, "-", "#000000", "#FFFFFF", false, TW_3);
  8674. }
  8675.  
  8676. QTableWidgetItem *Item1 = new QTableWidgetItem();
  8677. Item1->setIcon(QIcon("../images/01.png" ));
  8678. TW_3->setItem(num_ligne-1, 6, Item1 );
  8679. //complete_case(num_ligne-1, 5, ">", "#00FF00", "#000000", false, tableWidget_3);
  8680.  
  8681. duree = n_barre2 - n_barre1;
  8682. if (duree <0) {duree = 0;}
  8683. if (duree > 0)
  8684. {
  8685. //c'est ici que la durée de la note jouée est définie :
  8686. duree_txt.setNum(duree);
  8687. complete_case(num_ligne-2, 7, duree_txt, "#000000", "#FFFFFF", false, TW_3);
  8688. }
  8689.  
  8690. if (n_barre2 == n_barre1)
  8691. {
  8692. num_case++;
  8693. if (num_case>4) {num_case=4;}
  8694. }
  8695. else {num_case=1;}
  8696.  
  8697. // écriture du nom des notes sur fond coloré :
  8698. complete_case(num_ligne-1, num_case, nom_note, "#000000", couleur1, false, TW_3);
  8699. }
  8700. }
  8701.  
  8702. TW_3->resizeColumnsToContents();
  8703. // tableWidget_3->setColumnWidth(0, 100);
  8704.  
  8705. s1.setNum(0);
  8706. LE_de->setText(s1);
  8707.  
  8708. s1.setNum(num_ligne);
  8709. LE_a->setText(s1);
  8710. }
  8711.  
  8712.  
  8713. void MW::on_Bt_import_notes_clicked()
  8714. {
  8715. on_Bt_load_notes_clicked();
  8716. garnir_TW3();
  8717. }
  8718.  
  8719.  
  8720. void MW::copie_TW3_to_NOTES()
  8721. {
  8722. QString s1;
  8723. int T=0;
  8724. int D=0;
  8725. int L_max = TW_3->rowCount();
  8726. for(int L=0; L<L_max; L++)
  8727. {
  8728. s1 = TW_3->item(L, 7)->text(); // durée
  8729. D = s1.toInt();
  8730.  
  8731. for(int C=1; C<=4; C++)
  8732. {
  8733. s1 = TW_3->item(L, C)->text();
  8734. s1 = s1.left(3);
  8735. int m1 = s1.toInt(); //midi
  8736. if(m1>0) {ajout_note(m1, 0, T);}
  8737. }
  8738. T+=D;
  8739. }
  8740. checkBox_GI->setChecked(true);
  8741. on_Bt_copy_nt_M_to_T_clicked();
  8742. on_Bt_toggle_grille_M_clicked();
  8743. }
  8744.  
  8745.  
  8746.  
  8747. void MW::on_Boite_Onglets_Global_tabBarClicked(int index)
  8748. {
  8749. on_Bt_STOP_clicked();
  8750. efface_lst_frames();
  8751.  
  8752. if(index == 1) // on passe sur l'onglet 'NOTES'
  8753. {
  8754. // copie_TW3_to_NOTES(); // déplacé sur un bouton dédié
  8755. }
  8756.  
  8757. if(index == 2) // on passe sur l'onglet 'INSTRUMENTS'
  8758. {
  8759. // garnir_TW3(); // déplacé sur un bouton dédié
  8760. }
  8761. }
  8762.  
  8763.  
  8764. void MW::joue_morceau_debut()
  8765. {
  8766. //if(nb_lignes ==0){return;}
  8767. if (lecture_pause == 1)
  8768. {
  8769. Bt_lecture_2->setText("Jouer tout");
  8770. //Bt_lecture_2->setStyleSheet("QBt{background-color:#50FF1B;}");
  8771. lecture_pause =0;
  8772. QString s1;
  8773. s1.setNum(num_ligne_en_cours);// conversion num -> txt
  8774. Timer2->stop();
  8775. }
  8776. else
  8777. {
  8778. nb_notes_jouees_max = 10000;
  8779. // Bt_lecture_2->setText("[]");
  8780. //Bt_lecture_2->setStyleSheet("QBt{background-color:yellow;}");
  8781. lecture_pause = 1;
  8782. //num_note_stop=10000;
  8783. Tp1=0;
  8784. temps1=0;
  8785. Timer2->start(10);
  8786. }
  8787. }
  8788.  
  8789.  
  8790.  
  8791. void MW::on_Bt_lecture_2_clicked()
  8792. {
  8793. CB_saisie_au_clavier->setChecked(false);
  8794. num_ligne_en_cours =0;
  8795.  
  8796. // num_note_max = liste_NOTES_importees.length()-1;
  8797.  
  8798. num_note_max = TW_3->rowCount();
  8799. if (num_note_max < 1) {return;}
  8800. joue_morceau_debut();
  8801. }
  8802.  
  8803.  
  8804.  
  8805. void MW::set_zoom2()
  8806. {
  8807. zoom=2;
  8808.  
  8809. QFont fnt;
  8810. int n_max = TW_TimeLine->columnCount();
  8811.  
  8812. fnt.setFamily("Ubuntu");
  8813. fnt.setPointSize(8);
  8814. TW_TimeLine->setFont(fnt);
  8815.  
  8816. for(int n=0; n<n_max; n++)
  8817. {
  8818. TW_TimeLine->setColumnWidth(n, 20);
  8819. }
  8820.  
  8821. }
  8822.  
  8823.  
  8824. int MW::open_fichier_lst() // cette fonction est appelée par la fonction 'write_Tableau_vertical()'
  8825. {
  8826. QString ligne_i, str1;
  8827. QString s1;
  8828. int p1a, p1b;
  8829.  
  8830. // stop execution en cours
  8831. lecture_pause = 1;
  8832. Bt_lecture_2->setText("Jouer tout");
  8833. //Bt_lecture_2->setStyleSheet("QBt{background-color:#50FF1B;}");
  8834. lecture_pause =0;
  8835.  
  8836. s1.setNum(num_ligne_en_cours);// conversion num -> txt
  8837. Timer2->stop();
  8838.  
  8839. string_currentFile = QFileDialog::getOpenFileName(this, tr("Ouvrir Fichier accords..."), string_currentDir,
  8840. tr("Fichiers lst (*.lst);;All Files (*)"));
  8841.  
  8842. if (string_currentFile != "")
  8843. {
  8844. save_fichier_ini();
  8845. liste_str_in.clear();
  8846. liste_accords.clear();
  8847. }
  8848. else {return 0;}
  8849.  
  8850. int p1 = string_currentFile.lastIndexOf("/");
  8851.  
  8852. string_currentDir =string_currentFile.left(p1+1);
  8853.  
  8854. if (!string_currentFile.isEmpty())
  8855. {
  8856. LE_fichier_lst->setText(string_currentFile);
  8857. }
  8858. else {return 0;}
  8859.  
  8860. QFile file1(string_currentFile);
  8861. if (!file1.open(QIODevice::ReadOnly | QIODevice::Text)) return 1;
  8862. QTextStream TextStream1(&file1);
  8863.  
  8864. int num_ligne = 0;
  8865. ligne_i = TextStream1.readLine();
  8866. p1a=ligne_i.indexOf("v="); // vitesse
  8867. p1b=ligne_i.indexOf(";",p1a);
  8868. s1 = ligne_i.mid(p1a+2, p1b-(p1a+2));
  8869.  
  8870. int v1;
  8871. v1 = s1.toFloat();
  8872. dSBX_vitesse_2->setValue(v1);
  8873.  
  8874. while ( !TextStream1.atEnd() )
  8875. {
  8876. ligne_i = TextStream1.readLine();
  8877. liste_accords += ligne_i;
  8878. num_ligne++;
  8879. }
  8880.  
  8881. file1.close();
  8882.  
  8883. str1.setNum(num_ligne);
  8884. lineEdit_2->setText(str1 + " lignes");
  8885.  
  8886. int nb_de_lignes = num_ligne;
  8887.  
  8888. L_save_max = nb_de_lignes;
  8889.  
  8890. s1.setNum(0);
  8891. LE_de->setText(s1);
  8892.  
  8893. s1.setNum(nb_de_lignes);
  8894. LE_a->setText(s1);
  8895.  
  8896. return nb_de_lignes;
  8897. }
  8898.  
  8899.  
  8900. int MW::dechiffre_note(QString label_i, int L, int c) // dans la 'liste_accords[]' et complète case L C de TW3
  8901. {
  8902. int p1a, p1b, m1, h1;
  8903. QString ligne_i=liste_accords[L];
  8904. QString s1, s2;
  8905. QColor couleur1;
  8906.  
  8907. p1a=ligne_i.indexOf(label_i);
  8908. p1b=ligne_i.indexOf(";",p1a);
  8909. s1 = ligne_i.mid(p1a+3, p1b-(p1a+3));
  8910.  
  8911. if (s1=="") { return 0; }
  8912.  
  8913. m1 = s1.toInt();
  8914.  
  8915. if (m1==0) {return 0;}
  8916.  
  8917. h1 = calcul_hauteur_note(m1); // h1 = 0..11
  8918. couleur1 = liste_couleurs[h1];
  8919. s2 = " " + gamme_chromatique_d[h1];
  8920. s1 += s2;
  8921.  
  8922. complete_case(L, c, s1, "#000000", couleur1, false, TW_3);
  8923. return 1; // Une note est présente en L, C
  8924. }
  8925.  
  8926.  
  8927. QString MW::extraction_data(QString ligne_i, QString label)
  8928. {
  8929. int p1, p2, nb;
  8930. QString s1;
  8931.  
  8932. p1=ligne_i.indexOf(label);
  8933. if(p1 == -1) {return "";} // (pas trouvé)
  8934.  
  8935. p2=ligne_i.indexOf(";",p1);
  8936. nb = label.length();
  8937. s1 = ligne_i.mid(p1+nb, p2-(p1+nb));
  8938.  
  8939. return s1;
  8940. }
  8941.  
  8942.  
  8943. void MW::write_colonnes_texte(QString ligne_i, int L) // décrypte colonnes cmt, tps, Acc, cases...
  8944. {
  8945. QString s1, s2;
  8946. int dt;
  8947. int temps=0;
  8948.  
  8949. s1= extraction_data(ligne_i, "cmt="); // commetaire
  8950. complete_case(L, 5, s1, "#000000", "#FFFCDD", false, TW_3);
  8951.  
  8952. // la colonne 6 est un bouton vert '>'
  8953.  
  8954. s1= extraction_data(ligne_i, "d="); // durée
  8955. TW_3->setItem(L, 7, new QTableWidgetItem (s1) ); // dt
  8956. dt = s1.toInt();
  8957.  
  8958.  
  8959. s1= extraction_data(ligne_i, "M="); // mesure
  8960. if (s1 != " ")
  8961. {
  8962. complete_case(L, 8, s1, "#FFFFFF", "#888888", false, TW_3);
  8963. s1.setNum(temps);
  8964. complete_case(L, 9, s1, "#000000", "#FFFCDD", false, TW_3); // tps
  8965. temps =0;
  8966. }
  8967. else
  8968. {
  8969. s1.setNum(temps);
  8970. complete_case(L, 9, s1, "#000000", "#CECECE", false, TW_3);
  8971. }
  8972. temps += dt;
  8973.  
  8974. TW_3->setItem(L, 10, new QTableWidgetItem (" ")); // dispo
  8975.  
  8976. s1= extraction_data(ligne_i, "a="); // ACC
  8977. TW_3->setItem(L, 11, new QTableWidgetItem (s1));
  8978.  
  8979. s1= extraction_data(ligne_i, "cases=");
  8980. complete_case(L, 12, s1, "#000000", "#FFFFFF", false, TW_3);
  8981.  
  8982. s2="";
  8983. bool ok = false;
  8984.  
  8985. s1= extraction_data(ligne_i, "D0v="); // corde à vide
  8986. if ((s1 != "") && (s1 != "-")) { s2 += "D0v=" + s1 + ";"; ok = true; }
  8987.  
  8988. s1= extraction_data(ligne_i, "D0h="); // corde à vide
  8989. if ((s1 != "") && (s1 != "-")) { s2 += "D0h=" + s1 + ";"; ok = true; }
  8990.  
  8991. s1= extraction_data(ligne_i, "D1v="); // posiion "verticale" (c.d corde) du doigt 1 (index)
  8992. if ((s1 != "") && (s1 != "-")) { s2 += "D1v=" + s1 + ";"; ok = true; }
  8993.  
  8994. s1= extraction_data(ligne_i, "D1h="); // posiion "horizontale" (case) du doigt 1 (index)
  8995. if ((s1 != "") && (s1 != "-")) { s2 += "D1h=" + s1 + ";"; ok = true; }
  8996.  
  8997. s1= extraction_data(ligne_i, "D2v=");
  8998. if ((s1 != "") && (s1 != "-")) { s2 += "D2v=" + s1 + ";"; ok = true; }
  8999.  
  9000. s1= extraction_data(ligne_i, "D2h=");
  9001. if ((s1 != "") && (s1 != "-")) { s2 += "D2h=" + s1 + ";"; ok = true; }
  9002.  
  9003. s1= extraction_data(ligne_i, "D3v=");
  9004. if ((s1 != "") && (s1 != "-")) { s2 += "D3v=" + s1 + ";"; ok = true; }
  9005.  
  9006. s1= extraction_data(ligne_i, "D3h=");
  9007. if ((s1 != "") && (s1 != "-")) { s2 += "D3h=" + s1 + ";"; ok = true; }
  9008.  
  9009. s1= extraction_data(ligne_i, "D4v=");
  9010. if ((s1 != "") && (s1 != "-")) { s2 += "D4v=" + s1 + ";"; ok = true; }
  9011.  
  9012. s1= extraction_data(ligne_i, "D4h=");
  9013. if ((s1 != "") && (s1 != "-")) { s2 += "D4h=" + s1 + ";"; ok = true; }
  9014.  
  9015. if (ok != true) {s2=" ";}
  9016. QTableWidgetItem *item1 = new QTableWidgetItem();
  9017. item1->setText(s2);
  9018. // item1->setFlags(item1->flags() & ~Qt::ItemIsEditable); // passe en read only
  9019. TW_3->setItem(L, 13, item1);
  9020.  
  9021. }
  9022.  
  9023.  
  9024. int MW::write_Tableau_vertical() // décrypte la variable globale QStringList 'liste_accords[]'
  9025. {
  9026. QString s0, s1;
  9027. QString ligne_i;
  9028.  
  9029. int total =0;
  9030. int z;
  9031. //int num_note=0;
  9032.  
  9033. //liste_accords.clear();
  9034. int nb_de_lignes = open_fichier_lst(); // appel de la fonction qui peuple la variable (QString) 'liste_accords'
  9035. if (nb_de_lignes == 0) {return 1;}
  9036.  
  9037.  
  9038.  
  9039.  
  9040. init_TW_3();
  9041. TW_3->setRowCount(0);
  9042.  
  9043. mode_depot_note = false;
  9044.  
  9045. // -------------------------------------------------------------------------------
  9046. // on va transcrire ce contenu du String "liste_accords" dans le TW_3
  9047.  
  9048. for (int L=0; L<nb_de_lignes; L++)
  9049. {
  9050. on_Bt_AddLine_clicked();
  9051.  
  9052. ligne_i=liste_accords[L];
  9053.  
  9054. // traitement des 3 cases de gauche midi :
  9055. s1 = "";
  9056. z = dechiffre_note("m1=", L, 1); // z=1 si note présente
  9057. if (z==1) { total++; s0.setNum(total); s1 += " "; s1 += s0; }
  9058.  
  9059. z = dechiffre_note("m2=", L, 2);
  9060. if (z==1) { total++; s0.setNum(total); s1 += " "; s1 += s0; }
  9061.  
  9062. z = dechiffre_note("m3=", L, 3);
  9063. if (z==1) { total++; s0.setNum(total); s1 += " "; s1 += s0; }
  9064.  
  9065. z = dechiffre_note("m4=", L, 4);
  9066. if (z==1) { total++; s0.setNum(total); s1 += " "; s1 += s0; }
  9067.  
  9068. // écriture dans la colonne des n° de notes
  9069. complete_case(L, 0, s1, "#000000", "#FFFCDD", false, TW_3);
  9070.  
  9071. // traitement des cases de droite (commentaires , accords types etc...):
  9072. write_colonnes_texte(ligne_i, L);
  9073.  
  9074. }
  9075. TW_3->resizeColumnsToContents();
  9076. return 0;
  9077. }
  9078.  
  9079.  
  9080.  
  9081. void MW::on_Bt_Load_lst_clicked()
  9082. {
  9083. set_zoom2();
  9084. int w = write_Tableau_vertical();
  9085. // if (w==0)
  9086. {
  9087. //checkBox_not_erase->setChecked(true);
  9088. //gestion_mesures();
  9089. write_Time_line();
  9090. }
  9091. }
  9092.  
  9093.  
  9094. void MW::on_Bt_STOP_clicked()
  9095. {
  9096. Bt_lecture_2->setText("Jouer tout");
  9097. lecture_pause =0;
  9098. QString s1;
  9099. s1.setNum(num_ligne_en_cours);
  9100. Timer2->stop();
  9101. }
  9102.  
  9103.  
  9104.  
  9105.  
  9106.  
  9107. void MW::on_SB_tonique_valueChanged(int arg1)
  9108. {
  9109. int n=arg1;
  9110. LE_tonique->setText(gamme_chromatique_d[n]);
  9111. LE_tonique_GB->setText(gamme_chromatique_GB[n]);
  9112.  
  9113. lineEdit_10->clear();
  9114. LE_de_a->clear();
  9115. }
  9116.  
  9117.  
  9118. void MW::on_Bt_22_clicked()
  9119. {
  9120. QMessageBox msgBox;
  9121. QString s1;
  9122.  
  9123. s1 = "POSITION DES DOIGTS main gauche (sur le manche)";
  9124. s1 += "\n";
  9125. s1 += "\n";
  9126. s1 += "La première ligne (0) désigne la corde à vide";
  9127. s1 += "\n";
  9128. s1 += "\n";
  9129.  
  9130. s1 += "Chacune des 4 lignes suivantes (1 à 4) représente un doigt :";
  9131. s1 += "\n";
  9132. s1 += "\n";
  9133. s1 += "le numéro de la ligne désigne le doigt :";
  9134. s1 += "\n";
  9135. s1 += "doigt 1 = index, 2 = majeur...";
  9136. s1 += "\n";
  9137. s1 += "\n";
  9138. s1 += "Pour écrire dans le tableau cliquer au préalable sur une note (sur le manche)";
  9139. s1 += "\n";
  9140. s1 += "... puis ici sur une ligne (sur une des 4 petites flèches vertes)";
  9141. s1 += "\n";
  9142. s1 += "( corde 1 = mi aigü...)";
  9143. s1 += "\n";
  9144. s1 += "\n";
  9145. s1 += "Le tableau s'actualise également lorsqu'une note est jouée depuis la liste TW3";
  9146. s1 += "\n";
  9147. s1 += "\n";
  9148. s1 += "Dès lors, sur le manche, les numéros des doigts s'afficheront au centre des notes "
  9149. "pressées dans les cases (et pas forcément jouées, on peut très bien plaquer tout un "
  9150. "accord et ne jouer qu'une note à la fois, en arpège )";
  9151.  
  9152. msgBox.setText(s1);
  9153. msgBox.exec();
  9154. }
  9155.  
  9156.  
  9157. void MW::on_Bt_21_clicked()
  9158. {
  9159. QMessageBox msgBox;
  9160. QString s1;
  9161. s1 = "AIDE GENERALE";
  9162. s1 += "\n";
  9163. s1 += "\n";
  9164. s1 += "1- Ouvrir un fichier (texte) '.lst' préalablement sauvegardé' (comprend notes + positions des doigts)";
  9165. s1 += "\n";
  9166. s1 += "\n";
  9167. s1 += "VARIANTE : Importer la liste des notes (fichier binaire '.NTS' ).";
  9168. s1 += "\n";
  9169. s1 += "\n";
  9170. s1 += "2- Vérifier la durée (calculée) des mesures et modifier la durée des notes si nécessaire.";
  9171. s1 += "\n";
  9172. s1 += "3- Pour chaque ligne, configurer un accord type (qui représentera la position des doigts) ou une 'note seule'";
  9173. s1 += "(utiliser pour cela le 'Configurateur d'accords')";
  9174. s1 += " puis envoyer la configuration obtenue vers le tableau TW3, avec le bouton 'to TW3 -->' du 'configurateur d'Accords'.";
  9175. s1 += "\n";
  9176. s1 += "4- Reste à choisir les doigts pour chaque note. Voir l'aide du cadre 'Position des doigts'.";
  9177. s1 += "\n";
  9178. s1 += "\n";
  9179. s1 += "VARIANTE :";
  9180. s1 += "\n";
  9181. s1 += "\n";
  9182. s1 += "On peut aussi partir de zéro et entrer les notes une à une manuellement dans TW3 (TableWidget 3).";
  9183. s1 += "\n";
  9184. s1 += "Il est fortement conseillé de cliquer les notes sur le manche au préalable (voir l'aide du manche) ";
  9185. s1 += "plutôt que de saisir les libellés au clavier, afin d'éviter les saisies incorrectes.";
  9186. s1 += "On peut aussi créer les notes et les gérer dans l'onglet 'NOTES' qui comprend une aide pour lecture d'une partition musicale.";
  9187. s1 += "\n";
  9188. s1 += "puis les importer ici avec le bouton 'paste from NOTES TAB'";
  9189. s1 += "\n";
  9190. s1 += "\n";
  9191. s1 += "Au fait, pourquoi utiliser des mots anglais sur certains boutons?";
  9192. s1 += "\n";
  9193. s1 += "Tout simplement parce qu'il comprennent moins de lettres à loger dans ce petit espace.";
  9194. s1 += "\n";
  9195. s1 += "Essayez d'écrire : 'Coller depuis l'onglet NOTES' sur le bouton: =8 caractères de plus!";
  9196. msgBox.setText(s1);
  9197. msgBox.exec();
  9198. }
  9199.  
  9200.  
  9201.  
  9202.  
  9203.  
  9204. void MW::on_Bt_18_clicked()
  9205. {
  9206. QMessageBox msgBox;
  9207. QString s1;
  9208. s1 = "COPIE d'une note vers le tableau TW3 -->";
  9209. s1 += "\n";
  9210. s1 += "\n";
  9211. s1 += "1- clic-droit sur une note (sur le manche)";
  9212. s1 += "\n";
  9213. s1 += "Le curseur de la souris devient une croix";
  9214. s1 += "\n";
  9215. s1 += "2- cliquer_gauche alors dans une case de TW3 (colonnes 1 à 3)";
  9216. s1 += "\n";
  9217. s1 += "La note est alors collée dans le tableau";
  9218. s1 += "\n";
  9219. s1 += "\n";
  9220. s1 += "Si clic en dehors du tableau, l'opéraion est annulée";
  9221. s1 += "\n";
  9222.  
  9223. msgBox.setText(s1);
  9224. msgBox.exec();
  9225. }
  9226.  
  9227.  
  9228. void MW::on_Bt_20_clicked()
  9229. {
  9230. QMessageBox msgBox;
  9231. QString s1;
  9232. s1 = "Les fichiers .LST sont enregistrés au format texte.";
  9233. s1 += "\n";
  9234. s1 += "Il peuvent être facilement concaténés avec un éditeur de texte";
  9235. s1 += "\n";
  9236. s1 += "pour obtenir un morceau complet à partir de petites séquences.";
  9237. s1 += "\n";
  9238. s1 += "\n";
  9239. s1 += "Le n° barre est compté depuis le début.";
  9240. s1 += "\n";
  9241. s1 += "\n";
  9242. s1 += "La durée des notes n'est (volontairement) pas enregistrée dans les notes ";
  9243. s1 += "ce qui permet de ne PAS affecter l'emplacement de toutes les notes ";
  9244. s1 += "dans la trame temporelle lors de la modification, l'ajout ou la suppression d'une note"; s1 += "\n";
  9245. s1 += "Le tempo et le rythme sont ainsi conservés."; s1 += "\n";
  9246. s1 += "C'est d'ailleurs (me semble-t-il) l'approche retenue dans la norme midi.";
  9247. s1 += "\n";
  9248. s1 += "La durée des notes est donc calculée à postériori en fonction de la position temporelle des notes.";
  9249.  
  9250. msgBox.setText(s1);
  9251. msgBox.exec();
  9252. }
  9253.  
  9254.  
  9255. void MW::on_Bt_24_clicked()
  9256. {
  9257. QMessageBox msgBox;
  9258. QString s1;
  9259. s1 = "Les numéros qui s'affichent au centre des notes jouées sont ceux des doigts de la main gauche";
  9260. s1 += "\n";
  9261. s1 += "1=index, 2=majeur, 3=annulaire, 4=auriculaire";
  9262.  
  9263. msgBox.setText(s1);
  9264. msgBox.exec();
  9265. }
  9266.  
  9267.  
  9268. void MW::on_Bt_17_clicked()
  9269. {
  9270. QMessageBox msgBox;
  9271. QString s1;
  9272. s1 = "ABBREVIATIONS, sigles utilisés"; s1 += "\n";
  9273. s1 += "dans la colonne Cmt ->"; s1 += "\n";
  9274. s1 += "Sélectionner une ligne de TW3 au préalable"; s1 += "\n";
  9275. s1 += "\n";
  9276. s1 += "(GL = début glissendo"; s1 += "\n";
  9277. s1 += "GL) = fin glissendo"; s1 += "\n";
  9278. s1 += "HO = Hammer-On"; s1 += "\n";
  9279. s1 += "PO = Pull-Off"; s1 += "\n";
  9280. s1 += "pB = petit Barré (cordes 1-2-3)"; s1 += "\n";
  9281. msgBox.setText(s1);
  9282. msgBox.exec();
  9283. }
  9284.  
  9285.  
  9286. void MW::on_Bt_open_dossier_clicked()
  9287. {
  9288. QString s1, path1;
  9289. //int p1;
  9290. /*
  9291.   s1 = lineEdit_1->text();
  9292.   p1 = s1.lastIndexOf("/");
  9293.   s1.remove(p1, 255);
  9294.   path1 = s1;
  9295.   */
  9296. path1 = string_currentDir;
  9297.  
  9298. QProcess process1;
  9299. process1.setProgram("caja");
  9300. process1.setArguments({path1});
  9301. process1.startDetached();
  9302. }
  9303.  
  9304.  
  9305. void MW::complete_accord(int c_min, int c_max)
  9306. {
  9307. SBX_de->setValue(c_min);
  9308. case_min = c_min;
  9309.  
  9310. SBX_a->setValue(c_max);
  9311. case_max = c_max;
  9312.  
  9313. if (type_accords == 1) {on_Bt_ACCORD_1_clicked();}
  9314. if (type_accords == 2) {on_Bt_ACCORD_2_clicked();}
  9315. if (type_accords == 3) {on_Bt_ACCORD_3_clicked();}
  9316. if (type_accords == 4) {on_Bt_ACCORD_4_clicked();}
  9317. if (type_accords == 5) {on_Bt_ACCORD_5_clicked();}
  9318. }
  9319.  
  9320.  
  9321. void MW::on_Bt_toutes_clicked()
  9322. {
  9323. complete_accord(0, 20);
  9324. }
  9325.  
  9326.  
  9327. void MW::on_Bt_3a_clicked()
  9328. {
  9329. complete_accord(9, 12);
  9330. }
  9331.  
  9332.  
  9333. void MW::on_Bt_3b_clicked()
  9334. {
  9335. complete_accord(7, 10);
  9336. }
  9337.  
  9338.  
  9339. void MW::on_Bt_3c_clicked()
  9340. {
  9341. complete_accord(5, 8);
  9342. }
  9343.  
  9344.  
  9345. void MW::on_Bt_3d_clicked()
  9346. {
  9347. complete_accord(3, 6);
  9348. }
  9349.  
  9350.  
  9351. void MW::on_Bt_3e_clicked()
  9352. {
  9353. complete_accord(0, 3);
  9354. }
  9355.  
  9356.  
  9357. void MW::on_SB_de_valueChanged(int arg1)
  9358. {
  9359. QString s3, s4;
  9360. case_min = arg1;
  9361.  
  9362. if (arg1 > case_max) {SBX_a->setValue(arg1);}
  9363. s3.setNum(case_min);
  9364.  
  9365. case_max = SBX_a->value();
  9366. s4.setNum(case_max);
  9367. LE_de_a->setText(s3 + "a" +s4);
  9368.  
  9369. encadre_accord(case_min, case_max);
  9370.  
  9371. //complete_accord(case_min, case_max); // NON !! pas ici !!!!
  9372. }
  9373.  
  9374.  
  9375. void MW::on_SB_a_valueChanged(int arg1)
  9376. {
  9377. QString s3, s4;
  9378.  
  9379. case_min = SBX_de->value();
  9380.  
  9381. if (arg1 < case_min) {SBX_a->setValue(case_min);}
  9382.  
  9383. s3.setNum(case_min);
  9384.  
  9385. case_max = arg1;
  9386. s4.setNum(case_max);
  9387.  
  9388. LE_de_a->setText(s3 + "a" +s4);
  9389.  
  9390. encadre_accord(case_min, case_max);
  9391.  
  9392. //complete_accord(case_min, case_max); // NON !! pas ici !!!!
  9393. }
  9394.  
  9395.  
  9396.  
  9397.  
  9398.  
  9399.  
  9400. void MW::on_Bt_25_clicked()
  9401. {
  9402. QMessageBox msgBox;
  9403. QString s1;
  9404. s1 = "Sur cet onglet optimisé pour la guitare"; s1 += "\n";
  9405. s1 += "les notes < midi40 sont ignorées."; s1 += "\n";
  9406. s1 += "De fait le clavier du piano est délesté des touches les plus graves (une octave).\n";
  9407. s1 += "Les notes midi28 à midi39 sont toutefois prises en compte dans les onglets précédents."; s1 += "\n";
  9408.  
  9409. msgBox.setText(s1);
  9410. msgBox.exec();
  9411. }
  9412.  
  9413.  
  9414.  
  9415. void MW::on_SBX_tonique_valueChanged(int arg1)
  9416. {
  9417. int n=arg1;
  9418. LE_tonique->setText(gamme_chromatique_d[n]);
  9419. LE_tonique_b->setText(gamme_chromatique_b[n]);
  9420. LE_tonique_GB->setText(gamme_chromatique_GB[n]);
  9421.  
  9422. LE_accord_name->clear();
  9423. LE_de_a->clear();
  9424. LB_accord_name->clear();
  9425. }
  9426.  
  9427.  
  9428. void MW::on_SBX_de_valueChanged(int arg1)
  9429. {
  9430. QString s3, s4;
  9431. case_min = arg1;
  9432.  
  9433. if (arg1 > case_max) {SBX_a->setValue(arg1);}
  9434. s3.setNum(case_min);
  9435.  
  9436. case_max = SBX_a->value();
  9437. s4.setNum(case_max);
  9438. LE_de_a->setText(s3 + "a" +s4);
  9439.  
  9440. encadre_accord(case_min, case_max);
  9441.  
  9442. //complete_accord(case_min, case_max); // NON !! pas ici !!!!
  9443. }
  9444.  
  9445.  
  9446. void MW::on_SBX_a_valueChanged(int arg1)
  9447. {
  9448. QString s3, s4;
  9449.  
  9450. case_min = SBX_de->value();
  9451.  
  9452. if (arg1 < case_min) {SBX_a->setValue(case_min);}
  9453.  
  9454. s3.setNum(case_min);
  9455.  
  9456. case_max = arg1;
  9457. s4.setNum(case_max);
  9458.  
  9459. LE_de_a->setText(s3 + "a" +s4);
  9460.  
  9461. encadre_accord(case_min, case_max);
  9462.  
  9463. //complete_accord(case_min, case_max); // NON !! pas ici !!!!
  9464. }
  9465.  
  9466.  
  9467. void MW::numerote_1_note(int corde_i, int case_i, int num_i)
  9468. {
  9469. QString s1;
  9470. int x, y;
  9471.  
  9472. s1.setNum(num_i);
  9473.  
  9474. calcul_xy_note(corde_i, case_i, &x, &y);
  9475. textItem1 = new QGraphicsSimpleTextItem(s1);
  9476. QBrush brush1;
  9477. brush1.setStyle(Qt::SolidPattern);
  9478. brush1.setColor("#000000");
  9479. textItem1->setBrush(brush1);
  9480. textItem1->setPos(x+2, y -1);
  9481. calque_notes_manche->addToGroup(textItem1);
  9482. }
  9483.  
  9484.  
  9485. void MW::affi_positions_doigts_dans_status(QString s_i)
  9486. {
  9487. // et dans le cadre 'Position de doigts' (tableWidget_doigts)
  9488. // et numérote les notes jouées sur le manche
  9489.  
  9490. QString s2, s3;
  9491. int corde1, case1, num1;
  9492. init_TW_doigts();
  9493.  
  9494. s3="";
  9495. //---------------------------------------------------------------------------------------
  9496. s2=extraction_data(s_i, "D0v=");
  9497. if((s2 != "") && (s2 != "-"))
  9498. {
  9499. num1=0;
  9500. TW_doigts->setItem(0, 0, new QTableWidgetItem (s2) ); // corde
  9501. TW_doigts->item(0, 0)->setTextAlignment(Qt::AlignCenter);
  9502. s3 += "( DOIGT 1 corde " + s2;
  9503. corde1 = s2.toInt();
  9504. label_44->setText("corde " + s2);
  9505.  
  9506. s2=extraction_data(s_i, "D0h=");
  9507. case1 = s2.toInt();
  9508. s3 += " case " + s2 + " ) ";
  9509. TW_doigts->setItem(0, 1, new QTableWidgetItem (s2) ); // case
  9510. TW_doigts->item(0, 1)->setTextAlignment(Qt::AlignCenter);
  9511. numerote_1_note(corde1, case1, num1);
  9512. label_45->setText("case " + s2);
  9513. }
  9514. //---------------------------------------------------------------------------------------
  9515. s2=extraction_data(s_i, "D1v=");
  9516. if((s2 != "") && (s2 != "-"))
  9517. {
  9518. num1=1;
  9519. TW_doigts->setItem(1, 0, new QTableWidgetItem (s2) ); // corde
  9520. TW_doigts->item(1, 0)->setTextAlignment(Qt::AlignCenter);
  9521. s3 += "( DOIGT 1 corde " + s2;
  9522. corde1 = s2.toInt();
  9523. label_44->setText("corde " + s2);
  9524.  
  9525. s2=extraction_data(s_i, "D1h=");
  9526. case1 = s2.toInt();
  9527. s3 += " case " + s2 + " ) ";
  9528. TW_doigts->setItem(1, 1, new QTableWidgetItem (s2) ); // case
  9529. TW_doigts->item(1, 1)->setTextAlignment(Qt::AlignCenter);
  9530. numerote_1_note(corde1, case1, num1);
  9531. label_45->setText("case " + s2);
  9532. }
  9533. //---------------------------------------------------------------------------------------
  9534. s2=extraction_data(s_i, "D2v=");
  9535. if((s2 != "") && (s2 != "-"))
  9536. {
  9537. //bool ok;
  9538. //int dec = s2.toInt(&ok, 10);
  9539. //if (ok==true)
  9540. {
  9541. num1=2;
  9542. TW_doigts->setItem(2, 0, new QTableWidgetItem (s2) ); // corde
  9543. TW_doigts->item(2, 0)->setTextAlignment(Qt::AlignCenter);
  9544. s3 += "( DOIGT 2 corde " + s2;
  9545. corde1 = s2.toInt();
  9546. label_44->setText("corde " + s2);
  9547.  
  9548. s2=extraction_data(s_i, "D2h=");
  9549. case1 = s2.toInt();
  9550. label_45->setText("case " + s2);
  9551.  
  9552. s3 += " case " + s2 + " ) ";
  9553. TW_doigts->setItem(2, 1, new QTableWidgetItem (s2) ); // case
  9554. TW_doigts->item(2, 1)->setTextAlignment(Qt::AlignCenter);
  9555. numerote_1_note(corde1, case1, num1);
  9556. }
  9557. }
  9558. //---------------------------------------------------------------------------------------
  9559.  
  9560. s2=extraction_data(s_i, "D3v=");
  9561. if((s2 != "") && (s2 != "-"))
  9562. {
  9563. //bool ok;
  9564. //int dec = s2.toInt(&ok, 10);
  9565. //if (ok==true)
  9566. {
  9567. num1=3;
  9568. TW_doigts->setItem(3, 0, new QTableWidgetItem (s2) ); // corde
  9569. TW_doigts->item(3, 0)->setTextAlignment(Qt::AlignCenter);
  9570. s3 += "( DOIGT 3 corde " + s2;
  9571. corde1 = s2.toInt();
  9572. label_44->setText("corde " + s2);
  9573.  
  9574. s2=extraction_data(s_i, "D3h=");
  9575. case1 = s2.toInt();
  9576. s3 += " case " + s2 + " ) ";
  9577. label_45->setText("case " + s2);
  9578. TW_doigts->setItem(3, 1, new QTableWidgetItem (s2) ); // case
  9579. TW_doigts->item(3, 1)->setTextAlignment(Qt::AlignCenter);
  9580. numerote_1_note(corde1, case1, num1);
  9581. }
  9582. }
  9583. //---------------------------------------------------------------------------------------
  9584. s2=extraction_data(s_i, "D4v=");
  9585. if((s2 != "") && (s2 != "-"))
  9586. {
  9587. //bool ok;
  9588. //int dec = s2.toInt(&ok, 10);
  9589. //if (ok==true)
  9590. {
  9591. num1=4;
  9592. TW_doigts->setItem(4, 0, new QTableWidgetItem (s2) ); // corde
  9593. TW_doigts->item(4, 0)->setTextAlignment(Qt::AlignCenter);
  9594. s3 += "( DOIGT 4 corde " + s2;
  9595. corde1 = s2.toInt();
  9596. label_44->setText("corde " + s2);
  9597.  
  9598. s2=extraction_data(s_i, "D4h=");
  9599. case1 = s2.toInt();
  9600. s3 += " case " + s2 + " ) ";
  9601. label_45->setText("case " + s2);
  9602. TW_doigts->setItem(4, 1, new QTableWidgetItem (s2) ); // case
  9603. TW_doigts->item(4, 1)->setTextAlignment(Qt::AlignCenter);
  9604. numerote_1_note(corde1, case1, num1);
  9605. }
  9606. }
  9607. //---------------------------------------------------------------------------------------
  9608.  
  9609. // statusbar->showMessage(s3);
  9610. }
  9611.  
  9612. QString MW::dialog_saisie_int(int v_min, int v_max)
  9613. {
  9614. bool ok;
  9615. QString s1;
  9616. int v1;
  9617.  
  9618. s1 = QInputDialog::getText(this, tr("QInputDialog::getText()"), tr("saisie int"), QLineEdit::Normal, "4", &ok);
  9619. if (ok && !s1.isEmpty())
  9620. {
  9621. bool ok = true;
  9622. int i_max = s1.length();
  9623. for(int i = 0; i<i_max; i++) { if( (s1[i] < '0') || (s1[i] > '9') ) {ok = false;} }
  9624. if (ok==true) { v1 = s1.toInt(); } else {s1=""; v1= -1;};
  9625. if( (v1 < v_min) || (v1 > v_max) ) { s1 =""; }
  9626. if((i_max>1) && s1[0] == '0') {s1 =""; } //rejet nb commençant par un zéro, sauf "0" tout seul
  9627. }
  9628. return s1;
  9629. }
  9630.  
  9631.  
  9632.  
  9633.  
  9634. void MW::on_TW_3_cellClicked(int row, int column)
  9635. {
  9636. ligne_TW3 = row;
  9637. QString s1, s2, s3, ACC, cases;
  9638. QString duree_txt;
  9639. int di=0;
  9640. int R;
  9641.  
  9642. //checkBox_not_erase->setChecked(true);
  9643.  
  9644. R = TW_3->currentRow();
  9645. num_ligne_en_cours = row;
  9646. s1.setNum(R+1);
  9647. lineEdit_9->setText(s1);
  9648.  
  9649. encadrement_ligne();
  9650.  
  9651. s2 = TW_3->item(row, column)->text(); // actuellement dans la case cible
  9652. s1 = lineEdit_n_midi->text();
  9653.  
  9654.  
  9655. int m1 = s1.toInt();
  9656.  
  9657. if ( (column>0) && (column<=4) && mode_depot_note == true) // >0 because la col. 0 ne contient pas de note, mais les n°
  9658. {
  9659. mode_depot_note = false;
  9660. label_MESSAGE->setVisible(false);
  9661. // statusbar->showMessage("");
  9662. MW::setCursor(Qt::ArrowCursor);
  9663. if(s1 != s2) // alors on inscrit la nouvelle valeur dans la case
  9664. {
  9665. int h1 = calcul_hauteur_note(m1); // h1 = 0..11
  9666.  
  9667. if(h1<0){h1+=12;}
  9668. if(h1>11){h1-=12;}
  9669.  
  9670. s3 = " " + gamme_chromatique_d[h1];
  9671. s1 += s3;
  9672.  
  9673. QColor couleur_case = liste_couleurs[h1];
  9674.  
  9675. complete_case(row, column, s1, "#000000", couleur_case, false, TW_3);
  9676.  
  9677. TW_3->resizeColumnsToContents();
  9678. }
  9679. else // on efface la valeur
  9680. {
  9681. TW_3->setItem(row, column, new QTableWidgetItem ("--") );
  9682. }
  9683. init_TW_T();
  9684. }
  9685.  
  9686.  
  9687. if (column==6) // celle qui contient les petits boutons ( triangles '>' verts)
  9688. {
  9689. //effacer_calque(scene1, calque_notes);
  9690.  
  9691. CB_dess1seuleNote->setChecked(false);
  9692.  
  9693. ACC = TW_3->item(row, 11)->text();
  9694. cases = TW_3->item(row, 12)->text();
  9695.  
  9696. notes_silencieuses = true;
  9697. joue_accord_complet(ACC, cases); // représentation graphique de la position avant de jouer la note
  9698. notes_silencieuses = false;
  9699.  
  9700. joue_1_ligne(row);
  9701.  
  9702. s1 = TW_3->item(row, 13)->text();
  9703. // affi_positions_doigts_dans_status(s1);
  9704. }
  9705.  
  9706. // if (column==6) { write_Time_line(); }
  9707.  
  9708. if (column==7)
  9709. {
  9710. s1 = dialog_saisie_int(0, 32);
  9711. TW_3->item(row, 7)->setText(s1);
  9712. }
  9713.  
  9714. if (column==9) // ACC
  9715. {
  9716. s1 = TW_3->item(row, 11)->text();
  9717. s2 = TW_3->item(row, 12)->text();
  9718.  
  9719. if (s1 !=" ")
  9720. {
  9721. notes_silencieuses = true;
  9722. joue_accord_complet(s1, s2);
  9723. notes_silencieuses = false;
  9724. }
  9725. }
  9726. /*
  9727.   if (column==11)
  9728.   {
  9729.   QMessageBox msgBox;
  9730.   QString s1;
  9731.   s1 = "Colonne read only";
  9732.   s1 += "\n";
  9733.   s1 += "Utiliser le cadre 'de saisie 'Position des doigts'";
  9734.   s1 += "\n";
  9735.   s1 += "pour saisir les positions.";
  9736.   msgBox.setText(s1);
  9737.   msgBox.exec();
  9738.   }
  9739. */
  9740. s2 = TW_3->item(row, 7)->text();
  9741. s2 = s2.mid(1);
  9742. mesure_a_encadrer = s2.toInt();
  9743.  
  9744. // write_Time_line();
  9745.  
  9746. duree_txt = TW_3->item(R, 6)->text();
  9747.  
  9748. di = duree_txt.toInt();
  9749. nb_colonnes_a_encadrer = di;
  9750.  
  9751. int T_note;
  9752. T_note = calcul_T_note(row);
  9753. num_colonne_a_encadrer = T_note;
  9754.  
  9755. encadrement_colonne();
  9756. TW_3->resizeColumnsToContents();
  9757. }
  9758.  
  9759.  
  9760. void MW::on_Bt_26_clicked()
  9761. {
  9762. QMessageBox msgBox;
  9763. QString s1;
  9764. s1 = "Le fichier .LST contient les notes + les positions des doigts, c'est à dire tout le contenu de TW3";
  9765. s1 += "\n";
  9766. s1 += "Ce fichier est donc plus complet que les fichiers .NTS qui ne contiennent que les notes.";
  9767. msgBox.setText(s1);
  9768. msgBox.exec();
  9769. }
  9770.  
  9771.  
  9772.  
  9773. void MW::save_fichier_lst()
  9774. {
  9775. // enregisterment incrémentiel sur HDD (nom de fichier = 1..2...3...)
  9776.  
  9777. QString s1;
  9778. //QString ligne_i;
  9779. int numero=0;
  9780. QString s2;
  9781. QString chemin_out;
  9782.  
  9783. lecture_pause = 1;
  9784. Bt_lecture_2->setText(">");
  9785. Bt_lecture_2->setStyleSheet("QPushButton{background-color:#50FF1B;}");
  9786. lecture_pause =0;
  9787. s1.setNum(num_ligne_en_cours);// conversion num -> txt
  9788. Timer2->stop();
  9789.  
  9790. chemin_out = string_currentDir;
  9791.  
  9792.  
  9793. /*
  9794.   if (!dossier_out.exists())
  9795.   {
  9796.   QMessageBox msgBox;
  9797.   msgBox.setText("Le dossier : " + dossier_out.dirName() + " n'éxiste pas, je le crée");
  9798.   msgBox.exec();
  9799.   }
  9800. */
  9801. bool existe =1;
  9802. while(existe)
  9803. {
  9804. numero++;
  9805.  
  9806. s2.setNum(numero);
  9807. existe = QFile::exists(chemin_out + s2 + ".lst");
  9808. /*
  9809.   QMessageBox msgBox;
  9810.   QString s1;
  9811.   s1 = "Le fichier de destination (" + chemin_out + s2 + ".lst ) existe déjà";
  9812.   msgBox.setText(s1);
  9813.   msgBox.exec();
  9814. */
  9815. }
  9816.  
  9817. s2.setNum(numero);
  9818. int nb_lignes;
  9819.  
  9820. QFile file1(chemin_out + s2 + ".lst");
  9821. //file1.remove();
  9822.  
  9823. if (file1.open(QIODevice::WriteOnly | QIODevice::Text))
  9824. {
  9825. QTextStream file_out(&file1);
  9826.  
  9827. int vitesse = dSBX_vitesse_2->value();
  9828. QString s1;
  9829. s1.setNum(vitesse);
  9830. file_out << "v=" + s1 + ";";
  9831. file_out << char(10);
  9832. nb_lignes = liste_accords.length();
  9833. for (int i=0; i<nb_lignes; i++)
  9834. {
  9835. file_out << liste_accords[i]; // << char(10);
  9836. }
  9837. }
  9838. file1.close();
  9839.  
  9840. QMessageBox msgBox;
  9841. s1="Fichier enregistré: " + chemin_out + s2 + ".lst";
  9842. msgBox.setText(s1);
  9843. msgBox.exec();
  9844. }
  9845.  
  9846.  
  9847.  
  9848. int MW::constitue_liste_accords() // en vue de l'enregistrement sur le HDD (par la fonction 'save_fichier_lst()' ci-dessus)
  9849. {
  9850. // remarque: les codes midi sont 40..84 qui correspondent à des caractères ASCII classiques.
  9851. // la valeur 100 est utilisée (ici) pour coder les barres de mesure
  9852. // plus exactement, les codes ascii 32..126 codents poue des caratères classiques.
  9853. // on peut donc les encoder dans des QString qui eux sont facilement recordables...
  9854. QString s1; // valeurs midi d'un accord sous forme de texte
  9855. QString ligne_i;
  9856. int m1;
  9857. int L_min, L_max;
  9858.  
  9859. liste_accords.clear();
  9860. int RC3=TW_3->rowCount()-1;
  9861.  
  9862. // L_min = LE_de->text().toInt() -1;
  9863. // L_max = LE_a->text().toInt();
  9864. // if (L_min < 0) {L_min = 0;}
  9865. // if (L_max > RC3) {L_save_max = RC3;}
  9866.  
  9867. L_min = 0;
  9868. L_max = TW_3->rowCount();
  9869.  
  9870. if ((L_max - L_min) < 2)
  9871. {
  9872. QMessageBox msgBox;
  9873. msgBox.setText("Le tableau doit contenir au minimum 2 lignes !");
  9874. msgBox.exec();
  9875. return 1;
  9876. }
  9877.  
  9878.  
  9879. for(int L=L_min; L<L_max; L++)
  9880. {
  9881. ligne_i.clear();
  9882.  
  9883. // la colonne 0 est utilisée pour afficher les numéros des notes (qui peuvent être plusieurs pour chaque ligne)
  9884.  
  9885. s1 = TW_3->item(L, 1)->text(); s1 = s1.left(2); //colonne 1 -> note1
  9886. m1 = s1.toInt(); if ((m1<40)||(m1>84)) {s1="";} // code midi de la note
  9887.  
  9888. s1 = "m1=" +s1 + ";";
  9889. ligne_i += s1;
  9890.  
  9891. s1 = TW_3->item(L, 2)->text(); s1 = s1.left(2); // note2
  9892. m1 = s1.toInt(); if ((m1<40)||(m1>84)) {s1="";}
  9893. s1 = "m2=" +s1 + ";";
  9894. ligne_i += s1;
  9895.  
  9896. s1 = TW_3->item(L, 3)->text(); s1 = s1.left(2); // note3
  9897. m1 = s1.toInt(); if ((m1<40)||(m1>84)) {s1="";}
  9898. s1 = "m3=" +s1 + ";";
  9899. ligne_i += s1;
  9900.  
  9901. s1 = TW_3->item(L, 4)->text(); s1 = s1.left(2); // note4
  9902. m1 = s1.toInt(); if ((m1<40)||(m1>84)) {s1="";}
  9903. s1 = "m4=" +s1 + ";";
  9904. ligne_i += s1;
  9905.  
  9906. s1 = TW_3->item(L, 5)->text(); // commentaire ( (GL, GL), Ba, (HO, HO), PO, pB...)
  9907. s1 = "cmt=" +s1 + ";";
  9908. ligne_i += s1;
  9909.  
  9910. // la colonne 6 contient un bouton vert (exécution audio)
  9911.  
  9912. s1 = TW_3->item(L, 7)->text(); // DUREE en nb de barres
  9913. s1 = " " + s1; s1=s1.right(2); // ajoute 1'espace si nombre<10
  9914. s1 = "d=" +s1 + ";"; // durée
  9915. ligne_i += s1;
  9916.  
  9917. s1 = TW_3->item(L, 8)->text(); // MESURE
  9918. s1 = "M=" +s1 + ";";
  9919. ligne_i += s1;
  9920.  
  9921. s1 = TW_3->item(L, 9)->text(); // tps
  9922. s1 = "T=" +s1 + ";";
  9923. ligne_i += s1;
  9924.  
  9925. s1 = TW_3->item(L, 10)->text(); // dispo
  9926. // s1 = "x=" +s1 + ";";
  9927. // ligne_i += s1;
  9928.  
  9929. s1 = TW_3->item(L, 11)->text(); // ACCORD TYPE // exemple: Sol#(M7) , Do#(7d) , Fa(m)
  9930. s1 = "a=" + s1 + ";";
  9931. ligne_i += s1;
  9932.  
  9933. s1 = TW_3->item(L, 12)->text(); ; // cases "7a9"
  9934. s1 = "cases=" + s1 + ";";
  9935. ligne_i += s1;
  9936.  
  9937. s1 = TW_3->item(L, 13)->text(); // doigts (la case contient toute le string en question),
  9938. // voir la fonction : 'on_Bt_copie_doigts_to_TW3_clicked()' qui constitue ce string à partir du 'tableWidget_doigts.'
  9939.  
  9940. ligne_i += s1;
  9941. ligne_i += '\n';
  9942.  
  9943. liste_accords << ligne_i;
  9944. }
  9945. return 0;
  9946. }
  9947.  
  9948.  
  9949.  
  9950. void MW::on_Bt_save_LST_clicked()
  9951. {
  9952. int R = constitue_liste_accords();
  9953. if (R == 0) { save_fichier_lst(); }
  9954. }
  9955.  
  9956.  
  9957.  
  9958. void MW::on_Bt_sigle_1_clicked()
  9959. {
  9960. complete_case(num_ligne_en_cours, 5, "(GL", "#000000","#FFFCDD", false, TW_3);
  9961. }
  9962.  
  9963.  
  9964. void MW::on_Bt_sigle_2_clicked()
  9965. {
  9966. complete_case(num_ligne_en_cours, 5, "GL)", "#000000","#FFFCDD", false, TW_3);
  9967. }
  9968.  
  9969.  
  9970. void MW::on_Bt_sigle_3_clicked()
  9971. {
  9972. complete_case(num_ligne_en_cours, 5, "(HO", "#000000","#FFFCDD", false, TW_3);
  9973. }
  9974.  
  9975.  
  9976. void MW::on_Bt_sigle_4_clicked()
  9977. {
  9978. complete_case(num_ligne_en_cours, 5, "HO)", "#000000","#FFFCDD", false, TW_3);
  9979. }
  9980.  
  9981.  
  9982. void MW::on_Bt_sigle_5_clicked()
  9983. {
  9984. complete_case(num_ligne_en_cours, 5, "Ba", "#000000","#FFFCDD", false, TW_3);
  9985. }
  9986.  
  9987.  
  9988. void MW::on_Bt_sigle_9_clicked()
  9989. {
  9990. complete_case(num_ligne_en_cours, 5, "PO", "#000000","#FFFCDD", false, TW_3);
  9991. }
  9992.  
  9993.  
  9994. void MW::on_Bt_sigle_10_clicked()
  9995. {
  9996. complete_case(num_ligne_en_cours, 5, "pB", "#000000","#FFFCDD", false, TW_3);
  9997. }
  9998.  
  9999.  
  10000. void MW::on_TW_doigts_cellClicked(int row, int column)
  10001. {
  10002. QString s1, s2;
  10003.  
  10004. if(case_jouee == 0)
  10005. {
  10006. s1.setNum(corde_jouee);
  10007. TW_doigts->item(0, 0)->setText(s1);
  10008. return ;
  10009. }
  10010.  
  10011. if (column==2)
  10012. {
  10013. s1.setNum(corde_jouee);
  10014. TW_doigts->item(row, 0)->setText(s1);
  10015. s2.setNum(case_jouee);
  10016. TW_doigts->item(row, 1)->setText(s2);
  10017.  
  10018. }
  10019. }
  10020.  
  10021.  
  10022. void MW::on_Bt_RAZ_doigts_clicked()
  10023. {
  10024. init_TW_doigts();
  10025. }
  10026.  
  10027.  
  10028. void MW::on_Bt_copie_doigts_to_TW3_clicked()
  10029. {
  10030. // le 'TW_doigts' c'est le tableau de saisie dans le cadre 'Position des doigts'
  10031.  
  10032. QString s1, s_out;;
  10033. s1 = TW_doigts->item(0,0) ->text();
  10034. if (s1 != "-") {s_out += "D0v=" + s1 + ";";}
  10035. s1 = TW_doigts->item(0,1) ->text();
  10036. if (s1 != "-") {s_out += "D0h=" + s1 + ";";}
  10037.  
  10038. s1 = TW_doigts->item(1,0) ->text();
  10039. if (s1 != "-") {s_out += "D1v=" + s1 + ";";}
  10040. s1 = TW_doigts->item(1,1) ->text();
  10041. if (s1 != "-") {s_out += "D1h=" + s1 + ";";}
  10042.  
  10043. s1 = TW_doigts->item(2,0) ->text();
  10044. if (s1 != "-") {s_out += "D2v=" + s1 + ";";}
  10045. s1 = TW_doigts->item(2,1) ->text();
  10046. if (s1 != "-") {s_out += "D2h=" + s1 + ";";}
  10047.  
  10048. s1 = TW_doigts->item(3,0) ->text();
  10049. if (s1 != "-") {s_out += "D3v=" + s1 + ";";}
  10050. s1 = TW_doigts->item(3,1) ->text();
  10051. if (s1 != "-") {s_out += "D3h=" + s1 + ";";}
  10052.  
  10053. s1 = TW_doigts->item(4,0) ->text();
  10054. if (s1 != "-") {s_out += "D4v=" + s1 + ";";}
  10055. s1 = TW_doigts->item(4,1) ->text();
  10056. if (s1 != "-") {s_out += "D4h=" + s1 + ";";}
  10057.  
  10058. QTableWidgetItem *item1 = new QTableWidgetItem();
  10059. item1->setText(s_out);
  10060. //item1->setFlags(item1->flags() & ~Qt::ItemIsEditable); // read only
  10061. TW_3->setItem(ligne_TW3, 12, item1); // recopie le résultat dans TW3
  10062.  
  10063. // affi_positions_doigts_dans_status(s_out);
  10064. }
  10065.  
  10066.  
  10067. void MW::on_Bt_23_clicked()
  10068. {
  10069. on_Bt_save_LST_clicked();
  10070. init_TW_3();
  10071. efface_lst_frames();
  10072. lineEdit_2->clear();
  10073. LE_de->clear();
  10074. LE_a->clear();
  10075. }
  10076.  
  10077.  
  10078. void MW::on_Bt_Supp_line_clicked()
  10079. {
  10080. int R= TW_3->currentRow();
  10081. TW_3->removeRow(R);
  10082. }
  10083.  
  10084. void MW::on_Bt_copy_from_TW3_clicked()
  10085. {
  10086. liste_NOTES.clear();
  10087. effacer_calque(scene4,calque_notes_manuelles);
  10088. effacer_calque(scene4,calque_notes_auto);
  10089. effacer_calque(scene4,calque_notes_jouee);
  10090. effacer_calque(scene5, calque_histogramme );
  10091. effacer_calque(scene4, calque_echelle_temporelle_T);
  10092. effacer_calque(scene4, calque_echelle_temporelle_M);
  10093.  
  10094.  
  10095. copie_TW3_to_NOTES();
  10096. }
  10097.  
  10098. void MW::on_Bt_19_clicked()
  10099. {
  10100. QMessageBox msgBox;
  10101. QString s1;
  10102. s1 = "Copie les notes de l'onglet précédent ('NOTES') dans les 3 colonnes de gauche de TW3";
  10103. s1 += "\n";
  10104. msgBox.setText(s1);
  10105. msgBox.exec();
  10106. }
  10107.  
  10108.  
  10109.  
  10110.  
  10111. void MW::on_Bt_paste_from_clicked()
  10112. {
  10113. garnir_TW3();
  10114. }
  10115.  
  10116.  
  10117.  
  10118.  
  10119. void MW::on_Bt_load_left_col_clicked()
  10120. {
  10121. int nb_de_lignes = open_fichier_lst(); // appel de la fonction qui peuple la variable (QString) 'liste_accords'
  10122. if (nb_de_lignes == 0) {return;}
  10123.  
  10124. // init_TW_3();
  10125. // TW_3->setRowCount(0);
  10126.  
  10127. mode_depot_note = false;
  10128.  
  10129. while (TW_3->rowCount() < nb_de_lignes)
  10130. {
  10131. //on ralonge la liste TW3 le cas échéant afin qu'elle puisse contenir les nouvelles données
  10132. on_Bt_AddLine_clicked();
  10133. // vu qu'il peut y avoir plusieurs notes par ligne, la liste TW3 peut être plus courte que 'nb_de_lignes' (du fichier)
  10134. // on se retroubera alors avec un TW3 trop grand... (lignes vierges à la fin)
  10135. // ce n'est pas grave, mais pas très élégant ! à voir...
  10136. }
  10137.  
  10138. QString ligne_i;
  10139. for (int L=0; L<nb_de_lignes; L++)
  10140. {
  10141. ligne_i=liste_accords[L];
  10142. write_colonnes_texte(ligne_i, L);
  10143. }
  10144. TW_3->resizeColumnsToContents();
  10145. }
  10146.  
  10147.  
  10148.  
  10149.  
  10150. void MW::on_Bt_to_TW3_clicked()
  10151. {
  10152. QString s1;
  10153. int R = TW_3->currentRow();
  10154.  
  10155. s1=LE_accord_name->text();
  10156. if (s1 != "")
  10157. {
  10158. TW_3->setItem(R, 11, new QTableWidgetItem (s1) );
  10159.  
  10160. s1=LE_de_a->text();
  10161. TW_3->setItem(R, 12, new QTableWidgetItem (s1) );
  10162.  
  10163. TW_3->resizeColumnsToContents();
  10164. }
  10165. else
  10166. {
  10167. QMessageBox msgBox;
  10168. msgBox.setText("Choisir le type (Maj, Min, 7e de dom... au préalable)");
  10169. msgBox.exec();
  10170. }
  10171. }
  10172.  
  10173.  
  10174. void MW::on_Bt_27_clicked()
  10175. {
  10176. QMessageBox msgBox;
  10177. QString s1;
  10178. s1 = ""; s1 += "\n";
  10179. s1 += "Il faut cliquer sur une ligne de TW3 (afin de la sélectionner) avant d'envoyer l'accord ";
  10180. s1 += "avec le bouton vert 'to TW3 ->'.";
  10181. s1 += "";
  10182.  
  10183. msgBox.setText(s1);
  10184. msgBox.exec();
  10185. }
  10186.  
  10187.  
  10188. void MW::on_Bt_AddLine_2_clicked()
  10189. {
  10190. on_Bt_AddLine_clicked();
  10191. }
  10192.  
  10193.  
  10194. void MW::on_Bt_p10_2_clicked()
  10195. {
  10196. dSBX_vitesse_2->setValue(dSBX_vitesse_2->value()+10);
  10197. }
  10198.  
  10199.  
  10200. void MW::on_Bt_m10_2_clicked()
  10201. {
  10202. dSBX_vitesse_2->setValue(dSBX_vitesse_2->value()-10);
  10203. }
  10204.  
  10205.  
  10206. void MW::on_Bt_Go_3_clicked()
  10207. {
  10208. x_ligne_FFT=0;
  10209. image1.fill("#111111");
  10210. QColor noir = "#000000";
  10211. painter1.fillRect(0, 0, 1900, 900, noir);
  10212. label_image_FFT->setPixmap(QPixmap::fromImage(image1));
  10213. on_Bt_scan_auto_clicked();
  10214. }
  10215.  
  10216.  
  10217. void MW::on_Bt_28_clicked()
  10218. {
  10219. QMessageBox msgBox;
  10220. QString s1;
  10221. s1 = "Cet onglet est ajouté à titre documentaire. En clair il ne 'sert' à rien si ce n'est à représenter un spectre brut.";
  10222. s1 += "\n";
  10223. s1 += "Toutefois cela permet de constater que pour obtenir une grande précision fréquencielle ";
  10224. s1 += "il faut une durée d'analyse d'autant grande que la fréquence à analyser est basse. ";
  10225. s1 += "\n";
  10226. s1 += "On savait déjà qu'il faut une cadence d'échantillonage d'autant plus élevée que la fréquence à analyser est grande. ";
  10227. s1 += "On remarque donc que ces deux critères sont contradictoires si on veut les appliquer simultanément. ";
  10228. s1 += "\n";
  10229. s1 += "Je vous invite à ce propos à considérer 'le Principe d'incertitude' de Heisenberg'. qui dit que certaines grandeurs ";
  10230. s1 += "physiques ne sont pas mesurables simultanément avec une précision aussi grande que l'on veut. ";
  10231. s1 += "Ce qui sous-entend que ces grandeurs existent simultanément et que la méchante mécanique quantique nous interdit ";
  10232. s1 += "de les connaitres simultanément. ";
  10233. s1 += "En fait ces grandeurs (correspondant à des propriétés supposées) n'existent pas telles quelles. ";
  10234. s1 += "\n";
  10235. s1 += "Galilée a écrit que les mathématiques (comprendre la géométrie !!!) sont le langage de la nature. ";
  10236. s1 += "En fait les mathématiques sont le langage des modèles sensés (à une époque donnée) représenter la nature. ";
  10237. s1 += "Mais la nature quant à elle, se fiche bien de nos modèles ! A nous de nous adapter à elle et pas le contraire. ";
  10238. s1 += "En math on donne le domaine de définition d'une fonction. En physique il faudrait toujours donner ";
  10239. s1 += "le domaine de définition des modèles. Parfois ils prédisent des choses pas encore découvertes expérimentalement ";
  10240. s1 += "mais confirmées plus tard. Mais d'autres fois il nous font dire des bétises.";
  10241. s1 += "\n";
  10242. s1 += "Je vous invite à écouter Etienne Klein et Aurélien Barrau (et quelques autres physiciens) qui nous éclairent à ce sujet.";
  10243.  
  10244. msgBox.setText(s1);
  10245. msgBox.exec();
  10246. }
  10247.  
  10248.  
  10249.  
  10250. void MW::on_Bt_TEST_clicked()
  10251. {
  10252. double x = calque_noms_notes->pos().x();
  10253. calque_noms_notes->setPos(x+100, 0);
  10254. }
  10255.  
  10256.  
  10257. void MW::decal_notes_M(int d)
  10258. {
  10259. int nb;
  10260. int i0 = spinBox_i0->value();
  10261.  
  10262. uint32_t i_max = liste_NOTES.length();
  10263. for(int i =i0; i<i_max; i++)
  10264. {
  10265. nb = liste_NOTES[i].n_barreM;
  10266. nb +=d;
  10267. liste_NOTES[i].n_barreM = nb;
  10268. }
  10269. effacer_calque(scene4,calque_notes_manuelles);
  10270. affiche_liste_notes(); // en texte
  10271. trace_liste_notes(); // ellipses
  10272. }
  10273.  
  10274.  
  10275.  
  10276. void MW::on_Bt_moins_clicked()
  10277. {
  10278. decal_notes_M(-1);
  10279. }
  10280.  
  10281.  
  10282. void MW::on_Bt_plus_clicked()
  10283. {
  10284. decal_notes_M(1);
  10285. }
  10286.  

Mais où se cache cette fameuse transformée de Fourier rapide dans ce programme ?

Cherchez la fonction :

void MW::calcul_FFT()

ainsi que les fonctions :

void MW::calcul_tableau_W()
void MW::bit_reverse_tableau_X()
uint bit_reversal(uint num, uint nb_bits)


Voir aussi les fichiers complexe.cpp et complexe.h

Et pour les explications et les démonstrations mathématiques vior les liens au bas de cet article.

5 'MUSIQUE' : fichier mainwindow.h

CODE SOURCE en C++
  1.  
  2. #ifndef MAINWINDOW_H
  3. #define MAINWINDOW_H
  4.  
  5. #include <QMainWindow>
  6. #include "ui_mainwindow.h"
  7. //#include "instruments.h"
  8.  
  9. #include <QGraphicsView>
  10. #include <QGraphicsSceneMouseEvent>
  11. #include <QGraphicsTextItem>
  12. #include <QGraphicsLineItem>
  13. #include <QGraphicsRectItem>
  14. #include <QGraphicsItemGroup>
  15. //#include <QImage>
  16. #include <QProcess>
  17. #include <QtMultimedia/QMediaPlayer>
  18. #include <QAudioOutput>
  19. #include <QTimer>
  20.  
  21. #include "complexe.h"
  22.  
  23.  
  24. struct ENR_FFT
  25. {
  26. double amplitude; // 8 octets
  27. uint32_t t; // 4 octets
  28. uint8_t num; // 1 octet
  29. uint8_t midi; //1 octet
  30. // total 4+1+1+8 = 14 octets
  31. };
  32.  
  33. // à propos des notes : PRINCIPE
  34. // les notes ont une fréquence qui n'est pas directement enregistrée ici mais est représenté par le numéro MIDI.
  35. // elles ont un emplacement qui est enregistré et qui permet de connaitre l'instant de son jeu, connaissant la grille.
  36. // pour la grille temporelle, voir 'tracer_grille_MESURES()'
  37.  
  38. struct NOTE
  39. {
  40. uint16_t numero; // 2 octets
  41. uint8_t midi; // 1 octet; code midi. (et =0 pour un silence)
  42. int16_t n_barreT; // 2 octets; numéro de la barre temporelle (T, 1/20s)sur laquelle est posée la note
  43. int16_t n_barreM; // 2 octets; num de barre M sur laquelle.. (accepte les valeurs négatives)
  44. uint8_t statut; // 1 octet (8 bits); statut[0] -> selected
  45. // total 8 octets
  46. };
  47.  
  48.  
  49.  
  50. /* FFT */
  51.  
  52. class MW : public QMainWindow, public Ui::MW
  53. {
  54. Q_OBJECT
  55.  
  56. public:
  57. explicit MW(QWidget *parent = 0);
  58. ~MW();
  59.  
  60. protected:
  61.  
  62. void mousePressEvent(QMouseEvent *event);
  63. void mouseReleaseEvent(QMouseEvent *event);
  64.  
  65. void mouseMoveEvent(QMouseEvent *event);
  66. void contextMenuEvent(QContextMenuEvent *event); // clic de droite
  67.  
  68.  
  69. private slots:
  70. void Tic1();
  71. void Tic2();
  72. void Tic3();
  73. void save_fichier_ini();
  74. void load_fichier_ini();
  75. void choix_dossier_de_travail();
  76. void open_fichier_wav();
  77.  
  78. void on_Bt_load_wav_clicked();
  79. void ajustement_gain();
  80. void load_fichier_FRQ();
  81. int save_fichier_FRQ(QString date_i);
  82. void load_fichier_NOTES(QString s0);
  83. int save_fichier_NOTES(QString date_i);
  84. //void affiche_commentaire();
  85.  
  86. void decode_entete();
  87. void garnis_temp_data(qint32 offset);
  88.  
  89. void init_onglet_instruments();
  90. void parametrages();
  91. void init_TW_1();
  92. void init_TAB_FRQ();
  93. void init_TAB_lst_notes();
  94. void init_TW_type_M();
  95.  
  96. void init_TW_T();
  97. void init_TW_3();
  98. void init_Autres();
  99.  
  100. void Etiquette(int x, int dx, int y, QString s, QString coul_txt, QString coul_fond, QString coul_cadre , QGraphicsItemGroup *calque_i);
  101.  
  102. // déclaration pour onglet 'instruments'
  103. void charger_image_manche();
  104. void dessine_1_note(int corde_i, int case_i, QColor couleur_i);
  105. int calcul_midi(int corde_i, int case_i);
  106. void affiche_details_note(uint midi);
  107. QString nom_note_FR(int mid);
  108. void calcul_xy_note(int corde_i, int case_i, int *x_i, int *y_i);
  109.  
  110. void afficher_titre_calque(QString titre, int x, int y, QGraphicsItemGroup *calque_i);
  111. //--------------------------------------
  112. // sur onglet 'Source wav'
  113. void tracer_graduations_signal();
  114. void tracer_graduations_FFT(); // sur onglet 'Source wav'
  115. void tracer_echelle_V_3();
  116. void tracer_signal_complet(); // sur onglet 'Source wav'
  117. void tracer_gradu_temporelle_signal_entree(); // sur onglet 'Source wav'
  118. void tracer_signal_a_convertir(); // sur onglet 'Source wav'
  119.  
  120. //--------------------------------------
  121. void affiche_temps_barre(int n_barre);
  122.  
  123. void tracer_graduation_TAB_NOTES(); // midi; en colonne à gauche + noms des notes
  124. double calcul_temps(double x);
  125. void tracer_echelle_temps_TAB_NOTES(); //en secondes (scene4 sur l'onglet NOTES)
  126.  
  127. double calcul_pas_grille();
  128. void tracer_grille_M();
  129. void tracer_grille_T();
  130.  
  131. double calcul_x_barre(int n_barre);
  132. int calcul_tempo();
  133.  
  134. void trace_1_barre_M(double xi, QString couleur_i);
  135. void tracer_1enr(ENR_FFT enr_i);
  136. void detection_notes_auto(); // notes secondaires (affi par petits cercles colorés)
  137. void retracer_TAB_FRQ();
  138. void maj_TAB_NOTES();
  139.  
  140. void encadrement_signal(int x, int dx);
  141. void encadrement_note(int n_midi);
  142. void encadre_midi(int n_midi);
  143. int calcul_num_midi(double x);
  144. void tracer_1_ligneV_primaire_FFT();
  145. void tracer_segments_FFT();
  146.  
  147. void complete_ligne(int R);
  148. void on_Bt_AddLine_clicked(); // à la fin
  149. void on_Bt_AddLine_ici_clicked(); // ici
  150. void complete_case(int row, int column, QString s1, QColor c1, QColor c2, bool bold1, QTableWidget *QTI);
  151. void affiche_liste_notes();
  152. void trace_liste_notes(); //dessine des cercles colorés (couleur midi) sur la grille
  153. void deselect_notes();
  154.  
  155. void calcul_histogramme_durees();
  156. void affiche_histogramme_durees();
  157.  
  158. void calcul_histogramme_midi();
  159. void affiche_histogramme_midi();
  160.  
  161. void calcul_histogramme_degre(); // degrés de la gamme chromatique = 1..12
  162. void affiche_histogramme_degre();
  163.  
  164. void affiche_histogramme();
  165.  
  166. QString denombre_diezes_a_la_cle();
  167. int test_if_note_in_liste(int16_t n_barre, int midi);
  168. void affi_txt_en_couleur(int midi_i, QLineEdit *lineEdit_i);
  169.  
  170. int recherche_note(double y_i);
  171. void recherche_notes_rect(int x0, int y0, int x1, int y1);
  172. int calcul_num_barre(double xi);
  173. void ajout_note(int midi, int n_barreT, int n_barreM);
  174. void deplace_note(int num, int DG, int HB);
  175. void duplique_notes(int n_barreM_1, int n_barreM_2, int nombre);
  176. void supprime_note(int16_t n);
  177. uint16_t calcul_n_barreM_note(uint32_t n); // barre M la plus proche de la note posée sur une barre T
  178. uint16_t calcul_n_barreT_note(uint32_t n); // barre T la plus proche de la note posée sur une barre M
  179.  
  180. void remplir_tableau_echantillons_signal();
  181. void calcul_compression();
  182. void bit_reverse_tableau_X();
  183.  
  184. int calcul_y_note(int midi); // en pixels sur la grille
  185. int calcul_hauteur_note(int mid);
  186. void calcul_tableau_W();
  187. void calcul_FFT();
  188. void calcul_ofsset();
  189. void traitement_signal();
  190. void analyse_tout();
  191. QString nom_note(int mid);
  192. QString nom_note_GB(int mid);
  193. QString nom_octave_GB(int mid);
  194.  
  195. void affi_details_note(int midi);
  196.  
  197. void numerotation_liste_notes();
  198. void tri_liste_notes_par_num_barre();
  199. void suppression_notes_invalides();
  200. void suppression_mesures();
  201.  
  202. void saisie_clavier(int midi);
  203. void play_note(int midi);// sortie audio
  204. int joue_1_note_de_la_liste();
  205. void joue_1_ligne(int ligne_i);
  206. void encadre_accord(int case1, int case2);
  207.  
  208. void on_Bt_ACCORD_1_clicked();
  209. void on_Bt_ACCORD_2_clicked();
  210. void on_Bt_ACCORD_3_clicked();
  211.  
  212.  
  213. void joue_accord_complet(QString ACC, QString cases);
  214. // void surbrille_barre(num_barre);
  215. void surbrille_note(uint16_t n, bool HRM, int type);
  216. void surbrille_barre(int n_barre, QString couleur);
  217. void encadre_groupe_notes(int n_barre_i, int nombre);
  218. void trace_time_line();
  219.  
  220. void effacer_calque(QGraphicsScene *scene_i, QGraphicsItemGroup *calque_i);
  221.  
  222. void mode_grille_T();
  223. void mode_grille_M();
  224.  
  225. void on_spinBox_1_valueChanged(int arg1);
  226. void on_spinBox_2_valueChanged(int arg1);
  227. void on_spinBox_3_valueChanged(int arg1);
  228. void on_spinBox_4_valueChanged(int arg1);
  229. void on_spinBox_5_valueChanged(int arg1);
  230. void on_spinBox_6_valueChanged();
  231. void on_spinBox_7_valueChanged(int arg1);
  232. void on_Bt_8_clicked();
  233. void on_doubleSpinBox_1_valueChanged();
  234. void on_Bt_RAZ_clicked();
  235. void on_Bt_RAZ_2_clicked();
  236. void on_Bt_scan_auto_clicked();
  237. void on_Bt_2_clicked();
  238. void on_Btn_52_clicked();
  239. void on_Btn_94_clicked();
  240. void on_Bt_3_clicked();
  241. void on_Bt_close_entete_clicked();
  242. void on_Bt_6_clicked();
  243. void on_Bt_efface_clicked();
  244. //void on_Bt_5_clicked();
  245. void on_checkBox_rapide_stateChanged(int arg1);
  246. void on_doubleSpinBox_seuil_valueChanged(double arg1);
  247. void on_checkBox_norm_clicked();
  248. void on_Bt_jouer_tout_clicked();
  249. void on_Bt_toggle_grille_T_clicked();
  250. void on_Bt_toggle_grille_M_clicked();
  251. void on_Bt_toggle_visu_notes_clicked();
  252. void on_Bt_save_notes_clicked();
  253. void on_Bt_load_notes_clicked();
  254. void on_Bt_joue_passage_clicked();
  255. void on_Bt_joue_wav_clicked();
  256. void on_Btn_RAZ_notes_clicked();
  257. void on_Bt_mode_R_clicked();
  258. void on_Bt_mode_W_clicked();
  259. void on_Bt_toggle_visu_freq_clicked();
  260. void on_Bt_efface_2_clicked();
  261. void on_Bt_copy_nt_T_to_M_clicked();
  262. void on_Bt_copy_nt_M_to_T_clicked();
  263. void on_Bt_joue_wav_2_clicked();
  264. void on_Bt_choix_current_dir_clicked();
  265. void on_Bt_9_clicked();
  266. void on_Bt_load_FREQ_clicked();
  267. void on_Bt_decale_notes_L_clicked();
  268. void on_Bt_decale_notes_R_clicked();
  269. void decal_notes_M(int d);
  270. void on_tableWidget_type_M_cellClicked(int row, int column);
  271. void on_checkBox_flitrer_clicked();
  272. void on_Bt_open_DIR_clicked();
  273. void on_Bt_goto_clicked();
  274.  
  275. void on_bt_test_clicked();
  276. void on_Bt_test1_clicked();
  277. void on_Bt_test2_clicked();
  278.  
  279. void on_Bt_div2_clicked();
  280. void on_Bt_clicked();
  281. void on_Bt_next_clicked();
  282. void on_Bt_prev_clicked();
  283. void on_Bt_debut_clicked();
  284. void on_Bt_fin_clicked();
  285. void on_Bt_durees_div2_clicked();
  286. void on_Bt_durees_mult2_clicked();
  287. void on_Bt_detection_notes_clicked();
  288. void on_Bt_toggle_visu_notes_auto_clicked();
  289. void on_Bt_m10_clicked();
  290. void on_Bt_p10_clicked();
  291. void on_doubleSpinBox_gain_valueChanged(double arg1);
  292.  
  293. void on_Bt_open_DIR_2_clicked();
  294. void on_spinBox_nb_barres_valueChanged(int arg1);
  295. void on_spinBox_barre_zero_valueChanged(int arg1);
  296. void on_Bt_10_clicked();
  297. void on_Bt_mode_E_clicked();
  298. void on_Bt_RAZ_general_clicked();
  299. void on_Bt_deplace_L_clicked();
  300. void on_Bt_deplace_R_clicked();
  301. void on_doubleSpinBox_dxb_valueChanged(double arg1);
  302. void on_Bt_11_clicked();
  303. void on_radioButton_D_clicked();
  304. void on_radioButton_M_clicked();
  305. void on_radioButton_H_clicked();
  306. void on_Btn_RAZ_notes_2_clicked();
  307. void on_Bt_dedoubleM_clicked();
  308. void on_Bt_bak1_clicked();
  309. void on_Bt_mode_E_2_clicked();
  310. void on_checkBox_numerotation_toggled(bool checked);
  311. void on_Bt_copie_notes_clicked();
  312. void on_Bt_12_clicked();
  313. void on_doubleSpinBox_x0_valueChanged(double arg1);
  314. void on_doubleSpinBox_T0_valueChanged(double arg1);
  315. void on_spinBox_8_textChanged();
  316. void on_doubleSpinBox_t0_valueChanged();
  317. void on_spinBox_offset_valueChanged();
  318. void on_spinBox_zoom_2_valueChanged(int arg1);
  319. void on_spinBox_d_barres_valueChanged();
  320. void on_spinBox_x0a_valueChanged(int arg1);
  321. void on_doubleSpinBox_x0b_valueChanged(double arg1);
  322. void on_spinBox_dxa_valueChanged(int arg1);
  323. void on_checkBox_GI_clicked(bool checked);
  324. void on_Bt_13_clicked();
  325. void on_Bt_14_clicked();
  326.  
  327. void on_spinBox_offset_valueChanged(int arg1);
  328. void on_Bt_15_clicked();
  329. void on_spinBox_echx_valueChanged(int arg1);
  330. void on_Bt_deplace_H_clicked();
  331. void on_Bt_deplace_B_clicked();
  332. void on_Bt_par_defaut_clicked();
  333.  
  334. void on_Bt_composition_clicked();
  335. void on_Bt_5_clicked();
  336. void on_spinBox_hauteur_valueChanged(int arg1);
  337. void on_spinBox_octave_valueChanged(int arg1);
  338. void Ajouter_note(int midi);
  339. void on_Bt_ajout_clicked();
  340. void on_spinBox_duree_valueChanged(int arg1);
  341. void on_Bt_16_clicked();
  342. void on_Bt_aj_MAJ_clicked();
  343. void on_Bt_aj_Min_clicked();
  344. void on_Bt_aj_7dom_clicked();
  345.  
  346. void on_Bt_transposer_clicked();
  347.  
  348. // void on_Bt_deselect_clicked();
  349.  
  350. void on_checkBox_sel_boite_clicked();
  351.  
  352. void affi_clef();
  353. void affi_silence();
  354.  
  355. void on_checkBox_silence_clicked();
  356. void on_spinBox_num_barre_valueChanged(int arg1);
  357. void on_spinBox_num_note_valueChanged(int arg1);
  358.  
  359. void set_couleur_label(QColor c1, QLabel *Lb_i);
  360.  
  361. void on_Bt_E3_clicked();
  362. void on_Bt_F3_clicked();
  363. void on_Bt_Fd3_clicked();
  364. void on_Bt_G3_clicked();
  365. void on_Bt_Gd3_clicked();
  366. void on_Bt_A3_clicked();
  367. void on_Bt_Bb3_clicked();
  368. void on_BT_B3_clicked();
  369.  
  370. void on_Bt_C4_clicked();
  371. void on_Bt_Cd4_clicked();
  372. void on_Bt_D4_clicked();
  373. void on_Bt_Eb4_clicked();
  374. void on_Bt_E4_clicked();
  375. void on_Bt_F4_clicked();
  376. void on_Bt_Fd4_clicked();
  377. void on_Bt_G4_clicked();
  378. void on_Bt_Gd4_clicked();
  379. void on_Bt_A4_clicked();
  380. void on_Bt_Bb4_clicked();
  381. void on_Bt_B4_clicked();
  382.  
  383. void on_Bt_C5_clicked();
  384. void on_Bt_Cd5_clicked();
  385. void on_Bt_D5_clicked();
  386. void on_Bt_Eb5_clicked();
  387. void on_Bt_E5_clicked();
  388. void on_Bt_F5_clicked();
  389. void on_Bt_Fd5_clicked();
  390. void on_Bt_G5_clicked();
  391. void on_Bt_Gd5_clicked();
  392. void on_Bt_A5_clicked();
  393. void on_Bt_Bb5_clicked();
  394. void on_Bt_B5_clicked();
  395.  
  396. void on_Bt_C6_clicked();
  397. void on_Bt_Cd6_clicked();
  398. void on_Bt_D6_clicked();
  399. void on_Bt_Eb6_clicked();
  400. void on_Bt_E6_clicked();
  401. void on_Bt_F6_clicked();
  402. void on_Bt_Fd6_clicked();
  403. void on_Bt_G6_clicked();
  404. void on_Bt_Gd6_clicked();
  405. void on_Bt_A6_clicked();
  406. void on_Bt_Bb6_clicked();
  407. void on_Bt_B6_clicked();
  408. void on_Bt_C7_clicked();
  409.  
  410. void effacer_touches();
  411. void detecte_note_xy(int x_i, int y_i, int *corde_i, int *case_i);
  412. void execute_note_midi(uint midi);
  413.  
  414. void create_100_lignes_V();
  415. void efface_lst_frames();
  416. void trace_rectangle1(int x, int y, int dx, int dy);
  417. void encadrement_ligne(); // du tableWidget_3
  418. void TW_3_scroll(int H);
  419.  
  420. void trace_ligne_V(int num_colonne, int num_mesure);
  421. void write_Time_line();
  422. int calcul_T_note(int R);
  423. void trace_rectangle2(int x, int y, int dx, int dy);
  424. void encadrement_colonne(); // de la timeline en bas (tableWidget_T)
  425. // void on_tableWidget_3_cellClicked(int row, int column);
  426. void garnir_TW3();
  427.  
  428. void on_Bt_import_notes_clicked();
  429.  
  430. void copie_TW3_to_NOTES();
  431. void on_Boite_Onglets_Global_tabBarClicked(int index);
  432.  
  433. void joue_morceau_debut();
  434. void on_Bt_lecture_2_clicked();
  435.  
  436. void set_zoom2();
  437. int open_fichier_lst();
  438. QString extraction_data(QString ligne_i, QString label);
  439. int dechiffre_note(QString label_i, int L, int c);
  440. void write_colonnes_texte(QString ligne_i, int L);
  441. int write_Tableau_vertical();
  442. void on_Bt_Load_lst_clicked();
  443. void complete_accord(int c_min, int c_max);
  444.  
  445. void on_Bt_STOP_clicked();
  446. void on_Bt_choix_current_dir_2_clicked();
  447. void on_SB_tonique_valueChanged(int arg1);
  448. void on_Bt_22_clicked();
  449. void on_Bt_21_clicked();
  450. void on_Bt_24_clicked();
  451. void on_Bt_18_clicked();
  452. void on_Bt_20_clicked();
  453. void on_Bt_17_clicked();
  454. void on_Bt_open_dossier_clicked();
  455.  
  456. void on_Bt_3a_clicked();
  457. void on_Bt_3b_clicked();
  458. void on_Bt_3c_clicked();
  459. void on_Bt_3d_clicked();
  460. void on_Bt_3e_clicked();
  461.  
  462. void on_SB_de_valueChanged(int arg1);
  463. void on_SB_a_valueChanged(int arg1);
  464. void on_Bt_choix_current_dir_3_clicked();
  465. void on_Bt_25_clicked();
  466. void on_Bt_toutes_clicked();
  467. void on_SBX_tonique_valueChanged(int arg1);
  468. void on_SBX_de_valueChanged(int arg1);
  469. void on_SBX_a_valueChanged(int arg1);
  470. void numerote_1_note(int corde_i, int case_i, int num_i);
  471. void affi_positions_doigts_dans_status(QString s_i);
  472.  
  473. QString dialog_saisie_int(int v_min, int v_max);
  474. void on_TW_3_cellClicked(int row, int column);
  475. void on_Bt_26_clicked();
  476.  
  477. void save_fichier_lst();
  478. int constitue_liste_accords();
  479. void on_Bt_save_LST_clicked();
  480.  
  481. void on_Bt_sigle_1_clicked();
  482. void on_Bt_sigle_2_clicked();
  483. void on_Bt_sigle_3_clicked();
  484. void on_Bt_sigle_4_clicked();
  485. void on_Bt_sigle_5_clicked();
  486. void on_Bt_sigle_9_clicked();
  487. void on_Bt_sigle_10_clicked();
  488.  
  489.  
  490. void init_TW_doigts();
  491. void on_TW_doigts_cellClicked(int row, int column);
  492. void on_Bt_RAZ_doigts_clicked();
  493. void on_Bt_copie_doigts_to_TW3_clicked();
  494. void on_Bt_23_clicked();
  495. void on_Bt_Supp_line_clicked();
  496. void on_Bt_copy_from_TW3_clicked();
  497. void on_Bt_19_clicked();
  498. void on_Bt_paste_from_clicked();
  499.  
  500. void on_Bt_load_left_col_clicked();
  501. void on_Bt_ACCORD_4_clicked();
  502. void on_Bt_ACCORD_5_clicked();
  503. void on_Bt_to_TW3_clicked();
  504.  
  505. void on_Bt_27_clicked();
  506. void on_Bt_AddLine_2_clicked();
  507. void on_Bt_p10_2_clicked();
  508. void on_Bt_m10_2_clicked();
  509. void on_Bt_Go_3_clicked();
  510. void on_Bt_28_clicked();
  511.  
  512. void on_Bt_Cd7_clicked();
  513.  
  514. void on_Bt_TEST_clicked();
  515.  
  516. //void on_Bt_29_clicked();
  517.  
  518. void on_Bt_moins_clicked();
  519.  
  520. void on_Bt_plus_clicked();
  521.  
  522. //void on_Bt_30_clicked();
  523.  
  524. private:
  525.  
  526. QPoint Zoom_point2_;
  527.  
  528. // QImage image1;
  529.  
  530. QGraphicsScene *scene1; // sur l'onglet 'Source' - Trace FFT
  531. QGraphicsItemGroup *calque_notes;
  532. QGraphicsItemGroup *calque_reticule1;
  533. QGraphicsItemGroup *calque_trace_signal1;
  534. QGraphicsItemGroup *calque_trace_FFT;
  535. QGraphicsItemGroup *calque_curseur;
  536. QGraphicsItemGroup *calque_encadrement1;
  537. QGraphicsItemGroup *calque_lignes_F_zero;
  538.  
  539. QGraphicsScene *scene2; // sur l'onglet 'Source' - Signal d'entrée
  540. QGraphicsItemGroup *calque_reticule2;
  541. QGraphicsItemGroup *calque_encadrement2;
  542. QGraphicsItemGroup *calque_trace_signal2;
  543.  
  544. // QGraphicsScene *scene3;
  545. // QGraphicsItemGroup *calque_gradu_TAB_FRQ;
  546.  
  547. QGraphicsScene *scene4; // sur l'onglet 'NOTES'
  548. QGraphicsItemGroup *calque_TAB_FRQ;
  549.  
  550. QGraphicsScene *scene5; // sur l'onglet 'NOTES'
  551. QGraphicsItemGroup *calque_histogramme;
  552.  
  553. QGraphicsScene *scene_manche; // sur l'onglet 'instruments'
  554. QGraphicsItemGroup *calque_notes_manche;
  555. QGraphicsItemGroup *calque_encadrement3;
  556.  
  557. //QGraphicsScene *scene_FFTs; // sur l'onglet 'FFT'
  558. //QGraphicsItemGroup *calque_points_FFTs;
  559.  
  560. QGraphicsItemGroup *calque_noms_notes;
  561. QGraphicsItemGroup *calque_grille_T;
  562. QGraphicsItemGroup *calque_grille_M;
  563. QGraphicsItemGroup *calque_echelle_temporelle_T; // pour grille T
  564. QGraphicsItemGroup *calque_echelle_temporelle_M; // pour grille M
  565. QGraphicsItemGroup *calque_notes_manuelles;
  566. QGraphicsItemGroup *calque_notes_auto;
  567. QGraphicsItemGroup *calque_notes_jouee;
  568. QGraphicsItemGroup *calque_surbrillance;
  569. QGraphicsItemGroup *calque_rect_select;
  570.  
  571. QGraphicsLineItem *ligne1;
  572. QGraphicsLineItem *segment_trace;
  573. QGraphicsLineItem *segment_trace2;
  574. //QGraphicsLineItem *point_FFT;
  575. QGraphicsRectItem *rectangle1;
  576. QGraphicsRectItem *rectangle2;
  577. QGraphicsRectItem *rectangle3;
  578.  
  579. QGraphicsEllipseItem *ellipse1;
  580. QGraphicsRectItem *rect1;
  581. // QGraphicsRectItem *rect2;
  582. QGraphicsRectItem *rect3;
  583.  
  584. QFrame *Frame_wWidget1;
  585.  
  586. QGraphicsTextItem *GraphicsTextItem;
  587. QGraphicsSimpleTextItem *textItem1;
  588.  
  589. QMediaPlayer *player1;
  590. QMediaPlayer *player2;
  591. QMediaPlayer *player3;
  592. QMediaPlayer *player4;
  593. QMediaPlayer *player5;
  594.  
  595. QAudioOutput *audioOutput1;
  596. QAudioOutput *audioOutput2;
  597. QAudioOutput *audioOutput3;
  598. QAudioOutput *audioOutput4;
  599. QAudioOutput *audioOutput5;
  600.  
  601. QTimer *Timer1; // pour analyse auto à faible vitesse
  602. QTimer *Timer2; // pour rejouer les notes détectées
  603. QTimer *Timer3; // pour tests
  604.  
  605. //QList<QString> liste_couleurs;
  606.  
  607. QList<QFrame *> lst_frames;
  608.  
  609. };
  610.  
  611.  
  612.  
  613.  
  614.  
  615. #endif // MAINWINDOW_H
  616.  

6 fichier : complexe.cpp

CODE SOURCE en C++
  1.  
  2. #include "complexe.h"
  3. //
  4.  
  5. void Complexe::multi_lambda(float lambda)
  6. {
  7. a *= lambda;
  8. b *= lambda;
  9. }
  10.  
  11.  
  12. Complexe Complexe::operator+ (Complexe c)
  13. {
  14. Complexe r;
  15. r.a=this->a+c.a;
  16. r.b=this->b+c.b;
  17. return r;
  18. }
  19.  
  20.  
  21. Complexe Complexe::operator- (Complexe c)
  22. {
  23. Complexe r;
  24. r.a=this->a-c.a;
  25. r.b=this->b-c.b;
  26. return r;
  27. }
  28.  
  29.  
  30. Complexe Complexe::operator* (Complexe c)
  31. {
  32. Complexe r;
  33. r.a=this->a * c.a - this->b * c.b;
  34. r.b=this->a * c.b + this->b * c.a;
  35. return r;
  36. }
  37.  
  38.  
  39.  

7 fichier : complexe.h

CODE SOURCE en C++
  1.  
  2. #ifndef COMPLEXE_H
  3. #define COMPLEXE_H
  4. // Nombres complexes de la forme a+ib
  5.  
  6. //
  7. class Complexe
  8. {
  9.  
  10. public:
  11.  
  12. float a; // partie reelle
  13. float b; // partie imaginaire
  14. void multi_lambda(float lambda);
  15. Complexe operator+ (Complexe c);
  16. Complexe operator- (Complexe c);
  17. Complexe operator* (Complexe c); //equivaut a une rotation dans le plan (produit des modules, somme des arguments)
  18.  
  19. };
  20.  
  21.  
  22.  
  23.  
  24. #endif
  25.  

8 Autre programme : 'Guitare' - Présentation en vidéo


Ce nouveau programme constitue la suite logique du programme 'wav to midi'.
Il peut traiter la liste de notes générée par 'wav to midi'.
On part donc d'un fichier audio et on arrive à une sorte de suite de tablatures représentées sur la manche de la guitare avec position de chaque doigt de la main. Le tout ré-jouable avec respect du tempo.

Il fera l'objet d'un prochain article sur ce site. Je vous donne juste un aperçu en vidéo en attendant.
A suivre...

9 programme : 'Guitare' - video2


10 programme : 'Guitare' - video 3


Vous aurez reconnu le court extrait de "Hotel California" à titre d'exemple.

11 La Nouvelle version est en ligne !

8 septembre 2025 : Vous l'aurez sans doute remarqué 🔎️ en voyant défiler les numéros de version : je publie presque quotidiennement de nouvelles versions de ces deux programmes.

Aujourd’hui je prends la plume pour vous annoncer que j'ai fusionné ces deux programmes en un seul ( nommé 'MUSIQUE'), qui reprend la totalité des fonctions de chacun d'eux, accessibles par trois onglets de la fenêtre principale :
  • premier onglet : Fonctions d'acquisition et transformée de Fourier
  • deuxième onglet : GESTION DES NOTES sur les grilles temporelles, avec possibilité d'ajout et de suppression manuelle et de saisie d'après partition.
  • troisième onglet : INSTRUMENTS : Clavier et Guitare

Le tout en interconnexion permanente, opérant sur les mêmes données communes.
Je vous avoue que cela ne s'est pas fait tout seul, interconnexion ne signifie pas fusionner simplement les codes sources...
Des variables globales, des fonctions, des widgets, homonymes mais différents, ne peuvent pas cohabiter, il faut renommer beaucoup de choses, puis assurer rigoureusement les échanges d'informations. 😎️

C'est passionnant mais cela m'a demandé pas mal de temps, vu que le .cpp fait actuellement plus de dix mille lignes... Bon d'accord l'écriture est très "aérée", rarement plus d'une instruction par ligne, accolades "à la ligne" etc... c'est dans un soucis de lisibilité, variables intermédiaires inutiles... c'est mon style et ça me fait gagner du temps lorsque quelque chose cloche 🤔️...

Certains préfèrent ce genre de chose, trouvé sur le code source d'une page web, c'est pas ce qui manque :))

(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src

😀️

12 Documents

  • Code source complet (.cpp, .h, .ui etc...) + exemples : MUSIQUE.zip
Important : Le dossier 'notes2' contenant les échantillons audios des notes midi (midi 28 à midi 86) doit être placé dans le dossier de l’exécutable. (Ce dossier de l’exécutable (= Répertoire de compilation) étant choisi lors de la configuration du projet sous Qt Creator). Ces notes servent à rejouer la musique à partir des codes midi fournis par la transformée de Fourier. Idem pour les images 'cle3.jpg'

13 -

Liens...

1350