-
Notifications
You must be signed in to change notification settings - Fork 2
/
ROLLLoop.bi
4805 lines (4189 loc) · 160 KB
/
ROLLLoop.bi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#Include Once "crt/stdio.bi"
On Error GoTo errorloopbas
''(c As cairo_t Ptr, ByRef nro As Integer, ByRef octava As Integer Ptr, InicioDeLectura As Integer)
Sub creaPenta (c As cairo_t Ptr, Roll as inst )
On Local Error Goto fail
If repro=1 Or terminar=1 Then
Exit Sub
End If
'Dim octava As Integer Ptr
'*po va desde hasta -1 haci aabajo
indEscala=1 ' inicializamos la guiade escalas a la 1era
Dim As String t2="",t3="",t4=""
Dim As cairo_font_extents_t fe ' font data
Dim As cairo_text_extents_t te ' text size
Dim As Integer semitono,n, ic,indf,indfa,indfb,k
Dim As UByte code,repe
Dim As Integer verticalEnOctavaVacia
Dim As Integer notac, aconro, grado,repeind
repeind=12+(hasta-2)*13+hasta
'Print #1,"creaPenta ajustado repeind ",repeind 98 para 4 a 8
' VERSION 3 DEBO FORMAR LA OCTAVACOMPLET 12 SONIDOS
' v4 ponemos maslineas de separacion par q toda duricon este en espacios
' hay que usar el font Goergia o culqueir con utf8 o seguir lo que dice
'en usge http://www.non-gnu.org/guile-cairo/docs/html/Text.html
' sino ami me pasoque al poner una ñ las lineas desaparecen!
'5.6-ok-encolumnado en vez de poner lso numero de las nots debo colocr las durciones
' ya me ubique en unaline ahoradebo recibirlso pulsos 1,2,3,4,5,6,7
' directmente o almcenarlos en otro vector....
'if indice <= 0 then indice = 1
'if indice >= 128 then indice = 128
cairo_select_font_face (c, "Georgia", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL)
cairo_set_font_size (c, font)
' ======== NOTAS =========
' cuando hago click en Edit el fondo cambia en main para edicion
' movidol loopde semitonos 11-05-2021
'If COMEDIT = TRUE and estoyEnOctava = nro Then
' If octavaEdicion=estoyEnOctava Then
' cairo_set_source_rgba(c, 0, 1, 0.5, 1)
' Else
' cairo_set_source_rgba(c, 1, 1, 1, 1)
' EndIf
'Else
'
' cairo_set_source_rgba(c, 1, 1, 1, 1)
'EndIf
' --preubas de encabezado donde pondremos mas informaicon y tal vez menues botoes etc
Penta_y = BordeSupRoll + 14 * ( inc_Penta ) *( nro -1)
'--------------------------
t=" ESCALA: "+ UCase(tipoescala_inicial) + " [" +cadenaes_inicial +"] "
cairo_move_to(c, 0, BordeSupRoll - (hasta-9)*20* inc_Penta - inc_Penta)
cairo_show_text(c, t)
t= ""
' CAMBIOS FUTUROS FACILES: ubicar bien las posiciones de cada parametro con cairo_move tomar su argumento
' y colocar mas para cada parametro y luego si apreto click izquierdo aumento el valor
' si apreto click derecho lo disminuyo ,,o con la ruedita...Hace rlo mismo con el Pan
' de sonido para ubicar el sonido entre la derecha o izquierda,,,o
' PARA SABER SOBRE QUE CONTROL ESTOY HACE RUN CURSOSR PARA ESTA PARTE DE ARRIBA QUE PUEDA NAVEGAR
' ENTRE CONTROLES MODIFICABLES Y ESTAANDO UBICADO USAR RUEDITA O FLECHAS PARA CAMBIAR...
cairo_move_to(c, 0, BordeSupRoll - (hasta-9)*20* inc_Penta - 2* inc_Penta)
t=" CANAL MIDI: "+Str(canalx+1) ' para mostrar le sumo 1 pero se usa asi como viene 0 a 15
cairo_show_text(c, t)
t= ""
cairo_move_to(c, 0, BordeSupRoll - (hasta-9)*20* inc_Penta - 3* inc_Penta)
t=" I="+Str(tiempoPatron)
cairo_show_text(c, t)
t= ""
cairo_move_to(c, 0, BordeSupRoll - (hasta-9)*20* inc_Penta - 4* inc_Penta)
t= " Factor: "+ Str(FactortiempoPatron)
cairo_show_text(c, t)
t= ""
cairo_move_to(c, 0, BordeSupRoll - (hasta-9)*20* inc_Penta - 5* inc_Penta)
t= " Compas=" +TCompas
cairo_show_text(c, t)
t= ""
' t=" BordeSupRoll="+ Str(BordeSupRoll)
' cairo_move_to(c, 0, BordeSupRoll )
' cairo_show_text(c, t)
' t= ""
'--------------------------
cairo_move_to(c, 0, Penta_y )
cairo_line_to(c, ANCHO - 1, Penta_y )
' posicion es el indice del vector Roll
' curpos es la posicion del cursor de 1 a NroCol que suma a posicion
' porque posicion esta congelada pero hacemos q recorremos Roll con el cursor,
' cuando estoy en lectura el scroll avanza o retrocede con flechas izq der...
' en ctrl-M modo cursor lo q se mueve es el cursor solo, el vector queda quieto
' la posicion del vector en donde se modifica seria en el rango
' posicion NroCol sumandole el offset del cursor de 1 a NroCol
' o sea indice vEctor en Ctrl-M = posicion + curpos pero eso sucede
' internanmente para mostrar congelamos posicion y comenzamos desde ahi
' todo proceso de modificacion debera tener en cuenta a curpos, pero no
' la vista por pantalla
'If COMEDIT= TRUE Then
'Dim As Integer delta
'delta=NroCol
If cursorVert=0 And COMEDIT=TRUE Then
If posicion < NroCol*3/4 Then '04-02-2022
posishow= 1 ''curpos ' decia 1
' valla tatlmente al inicio veremos si es aca jmgjmg
Else
posishow = posicion - NroCol/2 '04-02-2022
EndIf
Else
If posicion=0 Then ' para TAB de track nuevo
posishow=1
posicion=1 ' 14-03-2022
Else
posishow = posicion
EndIf
EndIf
Dim As Integer lugar=0, sitio
lugarOld=Penta_y
For semitono = 0 To 11
If COMEDIT = TRUE and estoyEnOctava = *po Then ''+ 1 Then
If octavaEdicion=estoyEnOctava Then
cairo_set_source_rgba(c, 0, 1, 0.5, 1)
Else
cairo_set_source_rgba(c, 1, 1, 1, 1)
EndIf
Else
cairo_set_source_rgba(c, 1, 1, 1, 1)
EndIf
font= font - 2 ' achicamos notas giuas
'' t = NotasGuia(semitono) + Str(*octava) + "_["
'' cairo_move_to(c, 0, Penta_y + semitono * inc_Penta- 6)
If alteracion="bem" Then
t = NotasGuia2(semitono) + Str(*po -1) + "_["
Else
t = NotasGuia(semitono) + Str(*po -1) + "_["
EndIf
cairo_move_to(c, 0, Penta_y + (semitono+1) * inc_Penta- 6)
cairo_show_text(c, t)
t= ""
ic=0 'indice cursor 'donde se dibujara la duracion
n=0:indf=0:indfa=0:indfb=0
font= font + 2
For n = posishow To posishow + NroCol
' =======> deteccion escalas auxiliares y acordes
'' Print #1, " 12 + (*po-1) * 13 " ; 12 + (*po-1) * 13
'' Print #1, " *po , n "; *po, n
If NADACARGADO=TRUE Then
Else
indfb = CInt(Roll.trk (n, 12 + (*po-1) * 13).dur) ' 103 --dur
indfa = CInt(Roll.trk (n, 12 + (*po-1) * 13).pb) ' 26-01-2022 103 pb
ENDIF
t="": t2="":t3="":t4=""
' <====== CIFRADO ACORDE---
If indfa=201 And nVerCifradoAcordes=3 Then
cairo_set_source_rgba(c, 1, 1, 1, 1)
cairo_move_to(c,gap1 + (ic ) *anchofig , Penta_y)
verticalEnOctavaVacia= 12 + (hasta-2)*13 + estoyEnOctava - desde
If verticalEnOctavaVacia <= NA Then '09-03
notac=CInt(Roll.trk(n,verticalEnOctavaVacia ).nota) 'Rollnota
aconro=CInt(Roll.trk(n,verticalEnOctavaVacia ).dur) 'acordenro
If aconro >=1 And aconro <=43 Then ' por ahroa tenemo 43
t4=RTrim(ClaseAcorde(aconro).clase)
EndIf
If 13 - notac >= 1 And 13 - notac <=12 Then
t3=RTrim(NotasEscala(13-notac)) ' C/
grado = BuscarGrado(t3) ' 4 en escala G
t3=t3+t4
' Print #1,"grado ",grado
If ClaseAcorde(aconro).tipo >1 Then
If ClaseAcorde(aconro).tipo -1 + grado > 0 Then
t3=t3+notas_esc_inicial(ClaseAcorde(aconro).tipo -1 + grado)
' Print #1,"t3=t3+notas_esc_inicial(ClaseAcorde(aconro).tipo -1 + grado) ",t3
EndIf
EndIf
EndIf
t4=""
indfa=0
EndIf
Else
t3="":t4=""
indfa=0
EndIf
' =======> fin cifrado acordes----
If t3 >"" Then
cairo_show_text(c, t3)
t3=""
EndIf
If indfb = 200 And nVerEscalasAuxiliares=3 Then ' escalas auxiliares o alternativas
'Print #1,"ENTROA VER ESCAL AAUXILIAR"
cairo_set_source_rgba(c, 0, 1, 0, 1)
cairo_move_to(c,gap1 + (ic ) *anchofig , Penta_y)
cairo_line_to(c,gap1 + (ic ) *anchofig , Penta_y + 13.5 * inc_Penta )
notaescala=CInt( Roll.trk(n, 12 + (*po -1) * 13).vol)
If notaescala=0 Then
notaescala=1
EndIf
If Roll.trk(n, 12 + (*po -1) * 13).pan =3 Then
t2= NotasEscala(CInt( notaescala ))
EndIf
If Roll.trk(n, 12 + (*po -1) * 13).pan =2 Then
t2= NotasEscala2(CInt( notaescala ))
EndIf
' Print #1, "NOTAESCALA ",t2
' 11-01-2022
tipoescala=CInt(Roll.trk(n, 12 + (*po -1) * 13).inst)
If tipoescala=0 Then
tipoescala=1
EndIf
' Print #1," tipoescala ",tipoescala
armarescala cadenaes,tipoescala, notaescala, alteracion,0
' fin 11-01-2022
t2=t2+" "+ escala(tipoescala).nombre + " "+cadenaes
cairo_move_to(c,gap1 + (ic ) *anchofig , Penta_y + 13 * inc_Penta ) '26-01
indfb=0
Else
t2=""
indfb=0
EndIf
' t no puede quedar en un scope dsitinto se hace shared
' apenas usas t2 o t3 hay que borrarlas sino se pudre todo raro
If t2 >"" Then
cairo_show_text(c, t2)
' cairo_stroke(c)
t2=""
EndIf
' cairo_show_text(c, t)
' cairo_stroke(c)
cairo_set_source_rgba(c, 1, 1, 1, 1)
' <=========fin escalas y acordes
'' ver si peudo borrar esto 10-04-2022 ÇÇÇÇ
If Roll.trk (n,11- semitono + (*po -1) * 13 ).nota > 0 Or _
Roll.trk (n,11- semitono + (*po -1) * 13 ).dur > 0 Then
' print #1,"lugar ",11
' 10-04-2022 verificar si esto sigue funcionando ÇÇÇÇ colocar esapcios
If COMEDIT=TRUE Then
If cursorVert=0 Then
If espacio = (semitono +1) Then
Roll.trk (n, 11-semitono + (hasta -nro) * 13 ).dur = 181
''Print #1,"esta metiendo espacios?"
If fijarEspacio=0 Then
espacio=0
EndIf
EndIf
EndIf
' un buen forma de borrar facil y rpido seria usando
' ((n - inicioDeLectura)=curpos) y moviendoelcursor derecha izquierda
' en ctrl-m borra todo de una!! implementarlo...
If cursorVert=1 Then
If (espacio = semitono +1 ) And ((n - inicioDeLectura)=curpos) Then
Roll.trk (n,11-semitono + (*po-1) * 13 ).dur = 181
If fijarEspacio=0 Then
espacio=0
EndIf
EndIf
EndIf
' BORRADO LIBRE NO MARCA SOLO BLANCO habilita para usar nota=0
' If cursorVert=1 And Borrar=1 Then
' If ((n - inicioDeLectura)=curpos) Then
' Roll.trk (semitono + (*po) * 13, n ).dur = 0
' Roll.trk (semitono + (*po) * 13, n ).nota = 0
' If fijarEspacio=0 Then
' Borrar=0
' EndIf
' EndIf
' EndIf
EndIf
cairo_move_to(c, gap1 + ic * anchofig , Penta_y + (semitono+1 ) * inc_Penta - 4)
' print #1,"lugar ",12
indf= Roll.trk (n, 11- semitono + (*po-1) * 13).dur
' print #1,"lugar ",13
If (indf >= 1 And indf <= 182) Then ' 13-05-2021 11
Else
indf=181
EndIf ' t no puede quedar en un scope dsitinto se hace shared
t= figura(indf)
' cairo_show_text(c, t)
' cairo_stroke(c)
' cairo_set_source_rgba(c, 1, 1, 1, 1)
' ////////dar color al font en una determinada posicion durante el play
If n=jply And repro=0 Then
cairo_set_source_rgba(c,1,0,1,1)
EndIf
cairo_show_text(c, t)
' ' jmg 11-05-2021 1839 start
If n=jply And ( play =1 Or playb=1 Or Cplay=1 ) And repro=0 Then ' repro 17-06-2022
ShowNroCol= Int(n/posishow)
If ShowNroCol = 0 Then
curpos= n - 1
Else
curpos= n - posishow
EndIf
' If (kNroCol > 0) And (posicion = NroCol * kNroCol) And (posicion < MaxPos) Then
' curpos=curpos - kNroCol * NroCol
' EndIf
cursor(c,n,nro,Roll)
cairo_set_source_rgba(c, 1, 1, 1, 1)
EndIf
' jmg 11-05-2021 1839 end
'===== LINEAS DE COMPAS ==================================
If n >0 And n < MaxPos Then
' Print #1,"lugar ",14
If Compas(n).Posi = n Then
' aca tambien tendremos las repeticiones si estan las leemos y la usamos en el play
' seri aun loop como hasta ahora pero N veces no infinitas, o sea aca solo
' grabo las N veces y comienzo de loop y en el final grabare fin loop
' print #1,"lugar ",15
cairo_move_to(c,gap1 + (ic ) *anchofig +anchofig , Penta_y)
cairo_line_to(c,gap1 + (ic ) *anchofig +anchofig, Penta_y + 12 * inc_Penta )
' print #1, "|";
cairo_move_to(c,gap2 + (ic ) *anchofig +anchofig, Penta_y + 12.5 * inc_Penta )
t=Str(Compas(n).nro)
cairo_show_text(c,t)
EndIf
' Print #1,"lugar ",16
If n = pasozona1 Or n =pasoZona2 Then '26-06-2021
' Print #1,"lugar ",17
cairo_move_to(c,gap3 + (ic ) *anchofig +anchofig, Penta_y + 13.5 * inc_Penta )
t="("+ Str(n) + ")"
cairo_show_text(c,t)
EndIf
' If code > NA Then
' Print #1,"mayor que NA,code ", NA,code
' EndIf
code=Roll.trk (n, repeind).nota
repe=Roll.trk (n, repeind).vol
If code =210 Or code=211 Then
cairo_move_to(c,gap3 + (ic ) *anchofig +anchofig, Penta_y + 13.5 * inc_Penta )
Select Case code
Case 210
t="[:"
' Print #1,"code 210, *po= ", *po, t
Case 211
t= Str(repe)+":]"
' Print #1,"code 211, *po= ", *po, t
End Select
cairo_show_text(c,t)
End If
EndIf
cairo_move_to(c, gap1 + ic * anchofig , Penta_y + (semitono +1)* inc_Penta - 6)
ic += 1
' Else ' revisar es extraño que funcione porque n esta dentro del tramo de arriba Maxpos-1 < Maxpos zas
' If n= MaxPos Then ' indicador de final de secuencia
'cairo_move_to(c,gap1/4 + (ic ) *anchofig , Penta_y)
' cairo_move_to(c,gap1/4 + (ic ) *anchofig , Penta_y + 12 * inc_Penta )
' t=Str("*")
' cairo_show_text(c,t)
' cairo_move_to(c,gap1 + (ic ) *anchofig +anchofig , Penta_y)
' cairo_move_to(c,gap2 + (ic ) *anchofig +anchofig, Penta_y + 12 * inc_Penta )
' EndIf
''' Exit For ' sale para saltear las nota=0, dur=0 ¿?, estaba mal creo debo mostrar todo
EndIf
'con ic * 40 es + 32 osea ic * 40 + 32
Next n
'Else
'print #1, " n= ";n; " posn=";posn;" MaxPos=";MaxPos;" Posishow=";Posishow
'EndIf
' incremento aca ? raro lo deberia incrementar al cargar notas
'If n > MaxPos Then
' MaxPos = n
'
' EndIf
'--------TRAZADOI DE LINEAS VERTICALES GUIA DE COMPAS 1ERA VERSION
'------------------------
' ENTRADAD DE NOTA NUEVA CONMOUSE: SE ELIGE LA DURACION CON LASTECLS 1 A 8
'Y SE SELECCIONA CON EL MOUSE CLICKI ZQUIERDO,LA NOTA DESEADA.
' LAS OCTAVAS Y LA SNOTAS TODAS SE INVIERTE PORQUE EL VECTOR SE DIBUJA DE ARRIBA
' HACIA ABAJO Y COMO SE DESEA QUE LAS MAS AGUDAS ESTEN ARRIBA Y LAS MAS GRAVES ABAJO
' TENEMOS QUE LA OCTAVA 1 ES LA 1ERA DE ARRIBA HACIA ABAJO PERO AL INVERTIRLA
' ES LA OCTAVA 9 , PEOR PARA LOS CALCULOS CONTAMOS DE ARRIBA HACI AABAJO DE 1 A 9
' ASI LA OCATVA 3 (-1,0,1) O SEA LA 1 EN PANTALLA B1,C1 EN RELIDAD ES LA OCTAVA
' 7..Y B1 TIENE UN VALOR nR=(13-0-2) + (9-7)*13=37 y la PianoNota es 35
' restandole restar(37). Semitono va de arriba hacia abajo de 0 a 11 y
' nsE es la nota de carga va de 1 a 12.
lugar=Penta_y + (semitono +1) * inc_Penta
cairo_move_to(c, 0, lugar )
cairo_line_to(c, ANCHO - 1, lugar)
cairo_stroke(c) ' aca da exception al GrabarMidiIn con cancion cargada ..uff
If GrabarPenta=0 Then 'çççç NO ESTABA
If (mousey <= lugar) And (mousey >= lugarOld ) Then
nsE=semitono + 1 'semitono ahora va desde 0 a 11 usadopor entrada de tecladoy ahroa mouse
nR=(11-semitono) + (*po -1 ) * 13 ''+ (desde -1)*13 ' indice de la nota en Roll , en algo será util.
' If *po=1 Then
' Print #8, "nR octava 1 ",nR
' EndIf
PianoNota= nR - restar (nR)
''' desèjando nsE = 11 -nR + (*po -1 ) * 13 + 1
EndIf
lugarOld=lugar
Else 'çççç ELSE NO ESTABA
nsE=semitono + 1 'semitono ahora va desde 0 a 11 usadopor entrada de tecladoy ahroa mouse
nR=(11-semitono) + (*po -1 ) * 13 ''+ (desde -1)*13 ' indice de la nota en Roll , en algo será util.
PianoNota= nR - restar (nR)
EndIf
' ahora quiero que salga son semitono=12 asi lee las esclas y acordes
' o lo ponemos directamente en 12 salir del loop debe ser mas rapido?
If semitono =11 Then ' asi no suma 1 a semitono y no pasa a ser 12
Exit For
EndIf
Next semitono
' -----------------------------------------------------------
' PARA ENTRADA POR MOUSE SOLO DEBO DETERMINAR EL SEMITONO...
' y hacer nota=semiotono 1 a 11 con el mouse...el resto es automtico...
' nro=hasta significa que ya dibujo la octava 9, luego puede seguir dibujando
' hacia abajo, la ayuda
If *po = desde Then ' termino 9 octavas o la NA y ahora + ayuda...
cairo_set_font_size (c, font)
'cairo_select_font_face (c, "Georgia",CAIRO_FONT_SLANT_NORMAL , CAIRO_FONT_WEIGHT_BOLD)
t= "Flecha Abajo/Arriba o ruedita del mouse, scroll de las octavas en la ventana. F1 Ayuda Notepad "
cairo_move_to(c, 0, Penta_y + inc_Penta * 15 )
cairo_show_text(c, t)
t = "F9/F10 achica/agranda el font de las notas guia,F2/F3 proporcion "
cairo_move_to(c, 0, Penta_y + inc_Penta * 16 )
cairo_show_text(c, t)
t = "Entrar Notas Click en [Edicion] en Menu, otro Click en Edit para modificar, otro Click en Edit deja de editar,ESC TERMINA LA APP"
cairo_move_to(c, 0, Penta_y + inc_Penta * 17 )
cairo_show_text(c, t)
t = "En modificacion o Edit: CTRL-M o CTRL-N pasa al MODO CURSOR para reemplazar insertar borrar notas, para volver a Edit Ctrl-P"
cairo_move_to(c, 0, Penta_y + inc_Penta * 18 )
cairo_show_text(c, t)
t = "-/+ achica/agranda el area y altura de las octavas dentro de la ventana "
cairo_move_to(c, 0, Penta_y + inc_Penta * 19 )
cairo_show_text(c, t)
t = "AvPag/RePag scroll de las octavas mas rapido "
cairo_move_to(c, 0, Penta_y + inc_Penta * 20 )
cairo_show_text(c, t)
t = "Ctrl-Click en [Reproducir] Play con scroll e iluminacion de notas, o barra espaciadora"
cairo_move_to(c, 0, Penta_y + inc_Penta * 21 )
cairo_show_text(c, t)
t = "Configuracion, Tempo. Port Salida MIDI-OUT,Canales"
cairo_move_to(c, 0, Penta_y + inc_Penta * 22 )
cairo_show_text(c, t)
t = "Pulsar F1 Para Un Notepad Con Ayuda Preliminar mas detallada, puede estar incompleta y no ser lo ultimo"
cairo_move_to(c, 0, Penta_y + inc_Penta * 23 )
cairo_show_text(c, t)
t = "En el menu algunos funcionan con Ctrl-clik otros con click solamente o ALT"
cairo_move_to(c, 0, Penta_y + inc_Penta * 24 )
cairo_show_text(c, t)
t = "En modificacion o Edit, se pasa de una octava a otra para editarla, deslizando el mouse hasta el extremo derecho de la octava deseada, eso iluminara las lines de verde"
cairo_move_to(c, 0, Penta_y + inc_Penta * 25 )
cairo_show_text(c, t)
t = "la octava en edicion. (No hay vocales acentuadas, Cairo, la libreria grafica usada, no las maneja con font simples)"
cairo_move_to(c, 0, Penta_y + inc_Penta * 26 )
cairo_show_text(c, t)
t = "F2/F3 comprime - expande horizontalmente la secuencia proporcionalmente, se puede editar tambien"
cairo_move_to(c, 0, Penta_y + inc_Penta * 27 )
cairo_show_text(c, t)
t = "En Edit entrar notas: 1) duracion 1 a 9, luego el nombre CDEFGAB o Ctrl+ nombre para sostenidos "
cairo_move_to(c, 0, Penta_y + inc_Penta * 28 )
cairo_show_text(c, t)
t = "En Lectura navegar a derecha o izquierda con Flecha horizontales O CTRL IZQ,O CTRL DER MAS RAPIDO, arriba abajo con Flechas Verticales O RePAg AvPAg"
cairo_move_to(c, 0, Penta_y + inc_Penta * 29 )
cairo_show_text(c, t)
t = "En Lectura seleccionar zona entre 2 posiciones,con Ctrl+Click en cualquier parte de la posicion deseada de la octava deseada, repetir hacia derecha para la 2da posicion "
cairo_move_to(c, 0, Penta_y + inc_Penta * 30 )
cairo_show_text(c, t)
t = "Para ver el Final de la pista pulsar Tecla FIN, principio INICIO, "
cairo_move_to(c, 0, Penta_y + inc_Penta * 31 )
cairo_show_text(c, t)
End If
' si estoy en esta octava ...edicion solo para esa octava segun posicion
' del mouse automaticamete iluminar
If GrabarPenta =0 Then
If ( Penta_y <= mousey) And ((Penta_y + 12 * inc_Penta) >= mousey) Then
' estoy en una octava
estoyEnOctava = *po '<========== DETERMINACION DE OCTAVA DE TRABAJO
EnOctava=1
' CURSOR
'''' cairo_stroke(c) ESTOS STROKE HACEN QUE SALTE LA PANTALLACON - +
' Or (cursorHori=2 And cursorVert=2 paa hbilitar ctrl-N
If cursorHori=1 And cursorVert=1 Or play=1 Or playb=1 Then
cursor(c,posicion,nro,Roll) ' posicion por n 26-10-2021 se arreglo curpos
' se ilumina en posicion 0
EndIf
'''' cairo_stroke(c) ESTOS STROKE HACEN QUE SALTE LA PANTALLACON - +
'PERO PIERDO EL COLOR MARILLO DEL CURSOR
cairo_set_source_rgba c, 0, 0, 0, 1
'cairo_set_line_width(c, 3)
EndIf
else
If cursorHori=1 And cursorVert=1 Or play=1 Or playb=1 Then
cursor(c,posicion,nro,Roll) ' posicion por n 26-10-2021 se arreglo curpos
EndIf
cairo_set_source_rgba c, 0, 0, 0, 1
EndIf
'---------
If GrabarPenta=0 Then
If ((Penta_y + 12 * inc_Penta) <= mousey) And ((Penta_y + 14 * inc_Penta) >= mousey) Then
EnOctava = 0
estoyEnOctava=90
EndIf
EndIf
*po = *po -1
If *po = desde -1 Then ' 22-09-2021 < estaba mal es = ej 4 a 8 -> 4-1=3 ya ejecuto la 3 me voy
*po = 99
Exit Sub
EndIf
' ================ MENUES CONTEXTUALES GRAFICOS PARA MOUSE ==================
If ayudaModif=TRUE And COMEDIT=TRUE Then
If (cursorVert = 1 Or cursorHori = 1 ) Then
'print #1,".............SUBRUTINA........................................."
'print #1,"(9) ESTADO MUESTRA MENU COMANDOS"
'print #1,"ayudaModif=TRUE And COMEDIT=TRUE And (cursorVert = 1 or cursorHori = 1 )"
'print #1,"posicion curpos MaxPos,posn ", posicion, curpos, MaxPos,posn
If savemousex > 0 Or savemousey > 0 Then
usamousex=savemousex
usamousey=savemousey
Else
usamousex=mousex
usamousey=mousey
EndIf
Var cface => cairo_ft_font_face_create_for_ft_face( ftface, 0 )
Dim As String text0 => "BLANQUEAR"
Dim As String text1 => "INSERTAR"
Dim As String text2 => "FIN INSERTAR"
Dim As String text3 => "MODIFICAR"
Dim As cairo_text_extents_t extents
If mousey > 50 Then
cairo_set_font_face( c, cface )
cairo_set_font_size( c, 30 )
cairo_set_source_rgba( c, 1, 1, 1, 1 )
If menuMouse = 0 Then
cairo_move_to( c, usamousex, usamousey -110 )
cairo_text_extents( c, text0, @extents )
cairo_show_text( c, text0 )
menuMouse = 1
' print #1,"BLANQUEAR BORRAR SIN ELIMINAR"
Exit Sub
EndIf
If menuMouse = 1 Then
cairo_move_to( c, usamousex, usamousey -80 )
cairo_text_extents( c, text1, @extents )
cairo_show_text( c, text1 )
menuMouse = 2
' print #1,"INSERTAR"
Exit Sub
EndIf
If menuMouse = 2 Then
cairo_move_to( c, usamousex, usamousey -50 )
cairo_text_extents( c, text2, @extents )
cairo_show_text( c, text2 )
menuMouse = 3
' print #1,"FIN INSERTAR"
EndIf
If menuMouse = 3 Then
cairo_move_to( c, usamousex, usamousey -20 )
cairo_text_extents( c, text3, @extents )
cairo_show_text( c, text3 )
menuMouse = 0
' print #1,"MODIFICAR"
EndIf
EndIf
If savemousex=0 Or savemousey=0 Then
savemousex=mousex
savemousey=mousey
EndIf
EndIf
EndIf
If ayudaNuevaNota=TRUE And COMEDIT=TRUE And vuelta=FALSE Then
' SI SE SELECCIONA INSERTAR O MODIFICAR Y DUR=0 THEN IMPRIMIR
' "ELIJA ANTES UNA DURACION"
'print #1,".............SUBRUTINA........................................."
'print #1,"(10) ESTADO SELECCIONAR DURACION O CTRL-P/cTRL-p"
'print #1,"posicion curpos MaxPos,posn ", posicion, curpos, MaxPos,posn
If savemousex > 0 Or savemousey > 0 Then
usamousex=savemousex
usamousey=savemousey
Else
usamousex=mousex
usamousey=mousey
EndIf
Var cface => cairo_ft_font_face_create_for_ft_face( ftface, 0 )
Dim As String text(1 To 10) =>{"O","P","I","L","F","E","X","H", _
"CURSOR (ctrl-m)", "VOLVER (ctrl-p)"}
Dim As cairo_text_extents_t extents
If mousey > 50 Then
cairo_set_font_face( c, cface )
cairo_set_font_size( c, 30 )
cairo_set_source_rgba( c, 1, 1, 1, 1 )
Dim i As UByte
For i= 1 To 8
cairo_move_to( c, usamousex -90 + (i-1)*30, usamousey +10 )
cairo_text_extents( c, text(i), @extents )
cairo_show_text( c, text(i) )
Next i
' <= control-m O P
If cursorVert=0 Or cursorHori=0 Then
cairo_move_to( c, usamousex -60 , usamousey +50 )
cairo_text_extents( c, text(9), @extents )
cairo_show_text( c, text(9) )
EndIf
If cursorVert=1 Or cursorHori=1 Then
cairo_move_to( c, usamousex -60 , usamousey -40 )
cairo_text_extents( c, text(10), @extents )
cairo_show_text( c, text(10) )
EndIf
' menumouse = 0
' EndIf
EndIf
If savemousex=0 Or savemousey=0 Then
savemousex=mousex
savemousey=mousey
EndIf
EndIf
Exit Sub
fail:
Dim errmsg As String
If Err > 0 Then
errmsg = "FAIL Error " & Err & _
" in function " & *Erfn & _
" on line " & Erl & " " & ProgError(Err)
Print #1, errmsg
End If
End Sub
Sub barrePenta (c As cairo_t Ptr, Roll as inst )
'------------------
'''NroCol=(ANCHO / anchofig ) - 4 07-03 lo puse pero no se si ahce cancelar
'' no no es esto...lo que hace cancelar...
For i = desde To hasta
nro = i
' si ahce falta ejecutar mas de un Penta podremos usar threads
' asi funciona mejor o no? igual debe esperar a que termine el thread
' NOOOO ScreenSync no usar nunca sync desfasa el barrido de cairo y salta
' las lineas
creaPenta (c, Roll )
If *po = 99 Then
*po = hasta -1 ' 9 po ejemplo
Exit For
EndIf
Next
End Sub
'Roll Main Loop ACA NO APARECE EL VECTOR DE ROLL
sub RollLoop (ByRef param As pasa) ' (c As cairo_t Ptr, Roll As inst)
Dim As Integer ubiroll,ubirtk,encancion
' PORACA CANCELA '''' JMGDEBUG
abrirRollCargaMidi=2 ' no permite cargar Roll ya esta cargado
' si levantamos un plano de midi despues de cargar roll
Dim midionof As Integer
c=param.c
Roll=param.Roll
ubiroll=param.ubiroll
ubirtk=param.ubirtk
encancion=param.encancion
abrirRoll=4
ALTO=param.alto
ANCHO=param.ancho
ANCHO3div4 = ANCHO *3 / 4
midionof=param.midionof
If midionof = 4 Then ' volcado de midi
MIDIFILEONOFF=HABILITAR
End If
print #1,"rollLoop ubirtk ",ubirtk
print #1,"rollLoop ubiroll ",ubiroll
' print #1,"param.ancho ",param.ancho;" param.alto ";param.alto
' print #1,"posicion ", posicion
' Print #1,"ancho, alto", ANCHO, ALTO
' Print #1, "EN ROLLLOOP cargaCancion DEBE SER 1 EN INICIO ",cargaCancion
' If hwnd =0 Then ,GFX_WINDOWED
ScreenControl SET_DRIVER_NAME, "GDI"
If usarmarco= 3 then
ScreenRes ANCHO, ALTO , 32,1 , GFX_HIGH_PRIORITY
Else
ScreenRes ANCHO, ALTO, 32,1 , GFX_NO_FRAME Or GFX_HIGH_PRIORITY
EndIf
' print #1,"param.titulo ",param.titulo
WindowTitle param.titulo
ScreenControl GET_WINDOW_POS, x0, y0
ScreenControl(fb.GET_WINDOW_HANDLE,IhWnd)
hwnd = Cast(hwnd,IhWnd)
' datos recibidos
' print #1,"datos recibidos en rooloop nombre ", nombre
' print #1,"datos recibidos en rooloop desde,hasta ", desde, hasta
' print #1,"datos recibidos en rooloop *po ", *po
' print #1, "ubound roll.trk 2 ",ubound(roll.trk,2)
' End If
'Dim Roll As inst
' @Roll(1) = *pRoll
'Dim As Integer pid = GetCurrentProcessId()' , pid_parent = 0
abrirSecuencia(20)
' print #1 ,"pid", pid
Var surface = cairo_image_surface_create_for_data(ScreenPtr(), CAIRO_FORMAT_ARGB32, ANCHO, ALTO, stride)
c = cairo_create(surface)
Var surf2 = cairo_image_surface_create_for_data(ScreenPtr(), CAIRO_FORMAT_ARGB32, ANCHO, 50, stride)
cm = cairo_create(surf2)
/' AL CARGAR OCTAVAS MENOS QUE 1 9 SEGUIMOS EL DESDE E INCREMENTAMOS O DECEMENTAMON INC_pENTA
1 A 2 64 UP
2 A 3 54 UP
3 A 4 44 UP
4 A 5 30 UP
5 A 6 15 UP
6 A 7 0 UP
7 A 8 6 DOWN
8 A 9 9 DOWN
'/
inc_Penta = Int((ALTO -1) /40) - deltaip
'llena la surface con nro_penta
'nro_penta = ((ALTO - 1)- BordeSupRoll)/(inc_Penta * 4)
' Print nro_penta
Select Case desde
Case 1
BordeSupRoll = BordeSupRoll + 64 * inc_Penta
Case 2
BordeSupRoll = BordeSupRoll + 54 * inc_Penta
Case 3
BordeSupRoll = BordeSupRoll + 44 * inc_Penta
Case 4
BordeSupRoll = BordeSupRoll + 30 * inc_Penta
Case 5
BordeSupRoll = BordeSupRoll + 15 * inc_Penta
Case 6
Case 7
BordeSupRoll = BordeSupRoll - 15 * inc_Penta
Case 8
BordeSupRoll = BordeSupRoll - 30 * inc_Penta
Case 9
BordeSupRoll = BordeSupRoll - 44 * inc_Penta ' 16-09-2021
End Select
' print #1,"BordeSupRoll ",BordeSupRoll
'no se usa en ningun lado nro_penta = ((ALTO - 1)- BordeSupRoll)/(inc_Penta * 4)
' print #1,"INSTANCIA ", instancia
' Print #1,"call roolloop, tipoescala",tipoescala_inicial
' Print #1,"call roolloop, notaescala",notaescala_inicial
'If cargacancion=1 Then SOLO PARA DREBUG
' Print #1,"4 ROLLLOOP ENTRA A CARGAR PISTAS 1ERA VEZ cargaCancion ES 1 SI O SI ",cargaCancion
'EndIf
If ubiroll > 0 Then ' CARGA DE ARCHIVOS POR LINEA DE COMANDO DE ROLLMUSIC
' Print #1,"cargo archivo desde rollLoop"
nombre = titulos(0)
Print #1,"nombre",nombre
Print #1,"titulo(0) ",titulos(0)
CargaArchivo (Roll,ubiroll)
s5=2
ROLLCARGADO=TRUE
MenuNew=0
ubiroll=0
param.ubiroll=0
portout=CInt(pmTk(0).portout)
' abrir ports si no estan abiertos
GrabarPenta=0 ' para que en PlayAll abra los ports
EndIf
If ubirtk > 0 Then ' ya tengo el nommbre en linea de comando
' print #1,"carga track desde linea de comando, nombre antes ",titulos(0)
nombre = titulos(0)
CargarTrack (Track() , 0, ubirtk ) ' ntk=0
If nombre > "" Then '16-01-2022 crach si se cancela la carga
' print #1,"carga track veo nombre despues ", titulos(0)
TrackaRoll (Track() , 0 , Roll) ' ntk=0
' print #1,"TrackaRollcarga rtk veo nombre ", titulos(0)
RecalCompas (Roll)
TRACKCARGADO=TRUE
ubirtk=0
Else
TRACKCARGADO=FALSE
EndIf
' print #1,"despues RecalCompas veo nombre ", titulos(0)
MenuNew=0
ubirtk=0
param.ubirtk=0
' abrir ports si no estan abiertos
GrabarPenta=0 ' para que en PlayAll abra los ports
portout=CInt(pmTk(0).portout)
EndIf
If instancia = 7 Then ' 04-03-2024 LOGRE LEVANTAR CANCION EN UN ROLL EXTERNO
' CANCELA LA REPRODUCCION DEBERIA HABILITARLA VEREMOS
If NombreCancion > "" Then
Print #1, "rollloop instancia ", instancia
Print #1, "rollloop NombreCancion ", NombreCancion
'' carga de cancion porlinea de comandos
cargacancion=1
CargarPistasEnCancion ()
instancia=107 ' ficticio para que entre al if de TAB pero que no entre en el resto ni aca
param.encancion=1
'terminar=1
EndIf
EndIf
' -----------------
Do
''arranquedo1=Timer
edity1 = 1 ' botton Edit bordeSup
edity2 = 50 ' botton Edit bordeInf
'' Create a cairo drawing context, using the FB screen as surface.
'' l originalestba mal sizeof(integer ) es mu chico debe ser 4
stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, ANCHO)
' ---------------------para reducir el consumo de recursos por ahora al tocarpistas MIDI
' o grabar pistas midi con una cancion o track o roll cargado no escribimos nada en pantalla grafica
' queda congelado en los 1eros compasaes mostrados al terminar esos procesos mencionados
' se se libera la escrituta al grafico...vermeos si sirve para seguirgrabando pistas y reproduciendo
' en mejores condiciones,,,
If cargaCancion=1 Or repro=1 Or GrabarEjec=GrabarPistaEjecucion Then
' esta cargando cancion
'Locate 5,10
'Print "CARGANDO ...PISTA Nro ", ntk
'Sleep 100
s5=2 ' el loop principal necesita menos cpu
Else
'--------------
'''' If terminar=0 And GrabarEjec=0 Then '16-06-2022
ScreenLock()
cairo_set_source_rgba c, 0, 0, 0, 1
cairo_paint(c)
cairo_set_line_width(c, 1)
If s1 = 1 Then
s1= 0
EndIf
If s2 = 1 Then
s2=0
EndIf
If s6 = 1 Then
s6=0
EndIf
inc_Penta = Int((ALTO -1) /40) - deltaip
' ----------------------------------------------------------------------------
cairo_set_antialias (c, CAIRO_ANTIALIAS_DEFAULT) 'hace mas lental cosa pero nomeafecta
'---------------------------------------------------------------
'---------<======= ESCALAS AUXILIARES INSERCION ================>
' --------------------------------------------------------------
If cambioescala=1 And pasoZona1 > 0 Then ' creamos una posicion con cambio de escala en pasoZona1
tipoescala=tipoescala_num
notaescala=notaescala_num
Dim As Integer k,vacio
For K=desde To hasta -1 ' queda entre 2 octavas ,corregido 26-01-2022
' Print #1,"CARGO FOR !!! NOTA 30 DUR 200, k, pasozona1, NA ", "K=";K, pasoZona1,NA
vacio= 12 +(k -1) * 13
' Print #1,"vacio,tipoescala ",vacio, tipoescala
' Print #1,"vacio,notaescala ",vacio, notaescala
Roll.trk(pasozona1, vacio).inst=CUByte(tipoescala)
Roll.trk(pasozona1, vacio).vol= CUByte(notaescala)
Roll.trk(pasozona1,vacio ).nota = 30
Roll.trk(pasozona1,vacio ).dur = 200
' Print #1,"Roll.trk(pasozona1,k ).nota ",Roll.trk(pasozona1,k ).nota, k
' Print #1,"Roll.trk(pasozona1,k ).dur ",Roll.trk(pasozona1,k ).dur,k
If alteracion="sos" Then
Roll.trk(pasozona1, vacio).pan = 3
EndIf
If alteracion="bem" Then
Roll.trk(pasozona1, vacio).pan = 2
EndIf
Next K
' nota=30 , dur=200 indicara cambio de escala
guiaEscala(indEscala).posicion=posicion
cambioescala=0
pasoZona1=0
' sigue en crea_penta donde al barer el roll va leyendo las escalas auxiliares
EndIf
'05-02-2022 usamos threarPenta ya definida global
' se supone que la direccion es unica y se reusa no se la crea muchas veces
' es mejor no ¿? zas je
' cairo_text en creaPenta hace cancelar la salida desde Ventana Ctrl
' evitamos escribir a grafico si ya estamso saliendo ,,,
If terminar=0 Or repro=0 Then
threadPenta = ThreadCall barrePenta (c, Roll )