Musica e suoni in ambiente Pascal

(Nota di redazione: questo articolo è molto vecchio. All’epoca avevo 15 anni. Proseguendo nella lettura potresti sentire il bisogno di strapparti i bulbi oculari. Buona lettura.)

Nella libreria crt del Pascal esistono dei comandi speciali che spesso non si insegnano nei licei o nelle scuole, perchè “non utili all’appredimento del linguaggio”. Cioè, non solo ci tocca imparare questo linguaggio proprietario di merda, ma pure manco lo sfruttiamo.

Dato che ho tempo per cazzeggiare, ecco qui ciò che ho trovato:

  1. SOUND(hz); produce un suono alla frequenza inserita
  2. DELAY(time); produce un ritardo in millisecondi
  3. NOSOUND; interrompe il suono (indispensabile!)

Questi tre comandi si utilizzano in successione così elencati: con il primo lo speaker emette una frequenza (ad esempio 440 per un LA perfetto) con il secondo si prolunga la frequenza (ad esempio 1000 per un secondo) e con il terzo si interrompe la nota.

Un utilizzo molto interessante di queste nozioni può essere quello di far eseguire dal nostro Turbo Pascal (aka Masturbo Pasquale) una parte dell’Inno alla Gioia di Beehtoven, ad esempio…

Listato:
PROGRAM B; USES CRT;
VAR X,I:INTEGER;
PROCEDURE A(X:INTEGER);
BEGIN
SOUND(X);
DELAY(1000);
NOSOUND;
END;
BEGIN
CLRSCR;
WRITE('Stai ascoltanto l''Inno alla Gioia di Beethoven.');
FOR I:=0 TO 1 DO BEGIN
A(330);A(330);A(349);A(392);
A(392);A(349);A(330);A(294);
A(262);A(262);A(294);A(330);
IF(I=0)THEN BEGIN
A(330);A(294);A(294);
DELAY(1000);
END
ELSE BEGIN
A(294);A(262);A(262);
END;
NOSOUND;
END;
CLRSCR;
WRITE('Grazie per aver ascoltato Beethoven.');
READLN;
END.

Qui sopra abbiamo creato una procedura A(x), che richiama al suo interno SOUND(x), DELAY(200) e NOSOUND; esclusivamente per non ripetere i tre comandi di volta in volta.

La frequenza delle note

Per creare la scala di do che ci è servita per comporre il brano superiore, abbiamo soltanto utilizzato questo schema di note/frequenze da inserire nel comando SOUND()

Do 262 Do# 277 Re 294 Re# 311 Mi 330 Fa 349
Fa# 370 Sol 392 Sol# 415 La 440 La# 466 Si 49

Quindi, in conclusione, se vogliamo far emettere dalla macchina un LA per 2 secondi faremo:

begin
SOUND(440);
DELAY(2000);
NOSOUND;
end;

Tutto questo perchè il LA è rappresentato da un suono con frequenza 440 hertz, e due secondi sono rappresentati da un delay di 2000 millisecondi. Insomma, capito no?

Dunque è tutto, buona navigazione!

Semplice emulatore vocale per Windows

(Nota di redazione: questo articolo è molto vecchio. All’epoca avevo 15 anni. Proseguendo nella lettura potresti sentire il bisogno di strapparti i bulbi oculari. Se per caso possiedi la tecnologia necessaria per effettuare viaggi nel tempo, vieni qui e proibiscimi di scrivere questo post, perchè è da rincoglioniti, peggio di Aranzulla. Nello specifico, promuovere software proprietario per sistemi operativi proprietari equivale ad invogliarti ad avere rapporti sessuali senza protezione nella peggiore bettola della tua città. Ogni volta che rileggo questo post mi viene da piangere ed è questo il motivo per cui lo manterrò online. Con le dovute precauzioni, buona lettura.)

Vorremmo proporvi un piccolo programma per l’emulazione vocale perfettamente funzionante in Windows.

Permette di scrivere a tastiera un testo, di farlo leggere dalla macchina, di modificarne la velocità di lettura e il timbro di voce.

Molto divertente per doppiare i nostri filmati.

Cliccando sul link otterrete il classico file da zippare con all’interno diversi file, tra cui:

  • Reyboz_setup
  • Reyboz_setup2
  • Reyboz_voice

Cliccate su ognuno di essi in quest’ordine e rispondete di sì ad ogni messaggio di richiesta.

Buon emulatore vocale a tutti. Buona navigazione.

Orologio analogico in Turbo Pascal

Oggi vi presenteremo un programma in grado di simulare un orologio digitale. Per una piccola anteprima cliccate sull’immagine.

Immagine orologio offerta dal Reyboz Blog

Il file è disponibile gratuitamente da qui:

Analizziamo il programma

All’inizio vedremo una videata nera con una serie di numeri da zero a venti, e ci verrà chiesto di inserire il numero che per noi è al centro dello schermo. Il tutto verrà ripetuto finche non si inserisce uno di quei numeri da 0 a 20:

...
CLRSCR; (* Pulisci schermo *)
CC:=-1;
REPEAT (* Punto di ripetizione *)
FOR A:=0 TO 20 DO (* Ripeti 20 volte per scrivere 20 numeri *)
BEGIN
CC:=CC+1;
WRITE(CC:2,' ');
END; (* Fine ripetizione *)
WRITELN;
WRITELN;
WRITE('Scrivi il numero al centro del monitor: ');
READ(CC); (* L'utente inserisce CC *)
CLRSCR;
UNTIL (CC <= 20)AND(CC >= 0);
(* Da qui torna a 'repeat' se CC non è tra 0 e 20 *)
...

A questo punto il programma avrà come input questa fantomatica variabile CC. Servirà per sapere dove posizionare in futuro l’orologio, in modo che sembri al centro. Ma passiamo al punto in cui ci chiederà di inserire ore e minuti attuali, rappresentati da variabili intere HH e MM. Anche qui se l’ora inserita non sarà tra 0 e 24, e i minuti tra 0 e 60, il programma non andrà avanti e tornerà da capo:

...
REPEAT (* Punto di ritorno Until *)
IF(HH > 23)OR(MM > 59)OR(HH < 0)OR(MM < 0) THEN
WRITE('Errore formato. ');
WRITE('Scrivi l''ora attuale (HH MM): ');
READ(HH,MM); (* L'utente inserisce ora e minuti *)
CLRSCR; (* Ripulisci schermo *)
UNTIL (HH <= 23)AND(MM <= 59)AND(HH >= 0)AND(MM >=0);
...

Inseriti ore e minuti, siamo pronti a produrre l’orologio. Per fare ciò creeremo un’ulteriore variabile SS che conterrà i secondi, calcolati tramite uno script che rallenta di (17)*(17) mila volte il programma, avvicinandosi di molto ad un secondo reale:

...
T:=1700; (* T vale 1700 *)
WHILE(0 = 0)DO (* Inizia un ciclo infinito *)
BEGIN
SS:=SS+1; (* Aggiungi un secondo *)
FOR C:=0 TO T DO (* Inizio rallentamento *)
BEGIN FOR D:=0 TO T DO
BEGIN
END;
END; (* Fine rallentamento *)
CLRSCR;
IF(SS = 60)THEN (* Se ci sono 60 secondi crea un minuto *)
BEGIN
SS:=0;
MM:=MM+1;
END;
IF(MM = 60)THEN (* Se ci sono 60 min. crea un ora *)
BEGIN
SS:=0;
MM:=0;
HH:=HH+1;
END;
WRITE('Per interrompere: ctrl+pausa');
(* A questo punto a seconda di CC... *)
FOR A:=0 TO CC DO WRITELN; (* Crea CC spazi vuoti in verticale... *)
FOR B:=0 TO CC DO WRITE('   '); (* ...e in orizzontale *)
(* Ora scrivi ora, minuti, secondi *)
WRITE(' ',S1,HH:2,': ',MM:2,': ',SS:2,S2);
END;
...

Buona navigazione dallo staff.

Turbo Pascal di base

Ecco finalmente un riassunto schematico su funzioni condizioni strutture e operatori del Turbo Pascal, il famoso compilatore e esecutore di listati.

Turbo Pascal - Reyboz Blog

Download

Capiamo il linguaggio

Piccolo esempio

Program Potenza; Uses crt;
Var x,y: integer;
Begin
clrscr;
write('Inserisci qui un numero: ');
read(x);
y:=x*x;
writeln('Il quadrato di ',x,' è ,y);
readln
End.

Parti essenziali

  • Program per dare un nome al programma.
  • Uses per determinare la libreria (non lo cambiamo)
  • Var per nominare una lista di variabili e definirne il tipo
  • Begin per iniziare
  • End. per terminare.

Regole di scrittura essenziale

  • Ogni comando deve terminare con punto e virgola, il Begin fa eccezione.
  • L’End finale termina sempre in punto.
  • Prima di un Else non ci va mai il punto e virgola.

Funzioni predefinite

Legate a scrittura o lettura di una variabile

  • Clrscr; cancella l’output corrente
  • Delay(x); interrompe per x millisecondi il programma (solo in ambienti msdos)
  • Write(x); scrive x
  • Writeln(x); scrive x e va a capo
  • Writeln; scrive una riga vuota
  • Read(x); legge x da tastiera premendo invio
  • Readln(x); legge x da tastiera premendo invio e va a capo
  • Readln; crea una pausa che termina premendo invio
  • Sound(x); emette un bip alla frequenza inserita (occorre terminarlo con nosound;)
  • Nosound; interrompe il beep
  • X=Readkey; legge x da tastiera

Legate a calcoli con numeri interi

  • x=Sqr(x); calcola il quadrato di x
  • x=Chr(x); trova il carattere ASCII corrispondente a x
  • x=Sqrt(x); calcola il radicale di x
  • x=(x)div(y) esegue la divisione tra x e y
  • x=(x)mod(y) calcola il resto intero tra x e y

Legati a calcoli con numeri reali

  • x=In(x); calcola il logaritmo naturale di x
  • x=Int(x); calcola restituendo la parte intera di x
  • x=Sin(x); calcola il seno di x
  • x=Abs(x); calcola il modulo di x
  • x=Cos(x); calcola il coseno di x
  • x=Round(x); calcola approssimando ad intero x

Legati a calcoli con stringhe di testo

  • x=Lenght(x); conta il numero di caratteri di x

Calcoli con un carattere

  • x=Ord(x); individua il numero corrispondente a x come carattere

Condizioni logiche

Servono per definire un controllo tra più variabili.

  • (a<b) a minore di b
  • (a>b) a maggiore di b
  • (a<=b) a minore o uguale a b
  • (a>=b) a maggiore o uguale a b
  • (a<>b) a diverso da b
  • (a=b) a uguale a b

Operazioni logiche

Servono per definire un controllo tra più condizioni logiche.

  • ()and() Verifica una congiunzione logica
  • ()not() Verifica una negazione logica
  • ()or() Verifica una disgiunzione logica
  • ()xor() Verifica una disgiunzione esclusiva logica

Strutture iterattive

Servono per ripetere un operazione a seconda dell’uso.

  • While do
    Cosa fa: Controlla una condizione e ripete un’istruzione finchè la condizione è vera
    come si presenta: While (condizioni) do begin … end
  • Repeat until
    Cosa fa: Esegue un’istruzione e la ripete fintanto che la condizione non risulta vera
    Repeat (istruzioni) until (condizioni)
  • For to do
    Cosa fa: Impone un valore iniziale e finale, ripetendo un istruzione n volte
    Come si presenta: for a to n do begin (istruzioni) end

MSN alternativo per PC e dispositivi mobili

Vi piacerebbe poter chattare con Messenger sul vostro cellulare che non dispone di un’applicazione apposita? O magari sulla vostra console di gioco con connessione Internet?

Oppure vi è mai capitato di avere problemi con il vostro Msn Messernger sul vostro pc e non riuscire a trovare un’alternativa?

La risposta a tutte queste domande è il sito ufficiale di Ebuddy, raggiungibile da qualsiasi dispositivo dotato di connessione a internet che consente di collegarsi in modo alternativo al proprio account di Msn ma anche di Facebook, yahoo, aim, myspace ecc…

Semplicemente scegliendo uno di questi e inserendo il proprio ID (sotto la voce profilo d’accesso) e la propria Password!

Immagine di ebuddy offerta dal Reyboz Blog

Un metodo semplice, pratico e gratuito per connettervi ai vostri social network e ai vostri account di messaggistica istantanea in modo alternativo!

Perfezionare manualmente il boot loader Grub

Attenzione: Articolo tecnico scritto nel 2010! Segui a tuo rischio.

Cos’è grub

Grub è il Boot loader di molte distribuzioni GNU/Linux: un programma che parte all’accensione del PC per far scegliere da quale partizione o con quali altre opzioni avviare il PC.

Immagine di Grub

Puoi rimuovere tutti i menù inutilizzati e rinominare gli altri.

Piccola precauzione

Per ovvi motivi è bene copiare il testo del file /boot/grub/grub.cfg da qualche altra parte. Puoi farlo lanciando da terminale:
sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak
Così se capita qualcosa, da Ubuntu Live possiamo mettere tutto come prima.

E’ poi importante non copiare e incollare indiscriminatamente il contenuto di qualsiasi guida direttamente nei file di sistema come quelli di Grub: I dati cambiano da computer a computer.

Semplifichiamolo

Per rinominare o rimuovere i menù inutili puoi modificare /boot/grub/grub.cfg in questo modo:

  • Applicazioni → Accessori→ Terminale
    gksudo gedit /boot/grub/grub.cfg

A questo punto si aprirà il file di configurazione di Grub: cerchiamo con CTRL+F la parola “menuentry” per evidenziare nel file gli elementi d’avvio.

Immagine del listato di grub offerta dal Reyboz Blog

Il primo menuentry che si evidenzierà, rappresenta Ubuntu, e si riconosce da:

menuentry 'Ubuntu, con Linux 2.6.32-25-generic' --class ubuntu --class gnu-linux --class gnu --class os {recordfail
insmod ext2
set root='(hd0,5)'
search --no-floppy --fs-uuid --set c48efbff-0799-443a-bf46-8da16c687fe7
linux    /boot/vmlinuz-2.6.32-25-generic root=UUID=c48efbff-0799-443a-bf46-8da16c687fe7 ro  vga=791 quiet  quiet splash
initrd    /boot/initrd.img-2.6.32-25-generic
}

Modifichiamo quindi solamente il titolo a nostro piacimento e lasciamo intatto tutto il resto in modo che risulti:

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os {recordfail
insmod ext2
set root='(hd0,5)'
search --no-floppy --fs-uuid --set c48efbff-0799-443a-bf46-8da16c687fe7
linux    /boot/vmlinuz-2.6.32-25-generic root=UUID=c48efbff-0799-443a-bf46-8da16c687fe7 ro  vga=791 quiet  quiet splash
initrd    /boot/initrd.img-2.6.32-25-generic
}

Osserviamo invece l’ultimo menuentry, esso rappresenta la nostra seconda partizione, nel caso di alcuni, ad esempio Windows XP.

menuentry "Microsoft Windows XP Home Edition (on /dev/sda1)" {
insmod ntfs
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 661ccc411ccc0e4d
drivemap -s (hd0) ${root}
chainloader +1
}

Modifichiamo a nostro piacimento anche questo il titolo, in modo che risulti più semplice:

menuentry "Windows XP" {
insmod ntfs
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 661ccc411ccc0e4d
drivemap -s (hd0) ${root}
chainloader +1
}

Invece, per nascondere le modalità ripristino basta aggirarli vendendoli come commenti, mutantoli da così:

menuentry 'Ubuntu, con Linux 2.6.32-24-generic (modalità ripristino)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root='(hd0,5)'
search --no-floppy --fs-uuid --set c48efbff-0799-443a-bf46-8da16c687fe7
echo    'Caricamento Linux 2.6.32-24-generic...'
linux    /boot/vmlinuz-2.6.32-24-generic root=UUID=c48efbff-0799-443a-bf46-8da16c687fe7 ro single  vga=791 quiet
echo    'Caricamento ramdisk iniziale...'
initrd    /boot/initrd.img-2.6.32-24-generic
}

A così:

# menuentry 'Ubuntu, con Linux 2.6.32-24-generic (modalità ripristino)' --class ubuntu --class gnu-linux --class gnu --class os {
# recordfail
# insmod ext2
# set root='(hd0,5)'
# search --no-floppy --fs-uuid --set c48efbff-0799-443a-bf46-8da16c687fe7
# echo    'Caricamento Linux 2.6.32-24-generic...'
# linux    /boot/vmlinuz-2.6.32-24-generic root=UUID=c48efbff-0799-443a-bf46-8da16c687fe7 ro single  vga=791 quiet
# echo    'Caricamento ramdisk iniziale...'
# initrd    /boot/initrd.img-2.6.32-24-generic
# }

Stessa cosa per i vari memorytest, che li facciamo diventare da così:

menuentry "Memory test (memtest86+)" {
insmod ext2
set root='(hd0,5)'
search --no-floppy --fs-uuid --set c48efbff-0799-443a-bf46-8da16c687fe7
linux16    /boot/memtest86+.bin
}

A così:

# menuentry "Memory test (memtest86+)" {
# insmod ext2
# set root='(hd0,5)'
# search --no-floppy --fs-uuid --set c48efbff-0799-443a-bf46-8da16c687fe7
# linux16    /boot/memtest86+.bin
# }

Riavvio di ubuntu offerto dal Reyboz Blog

Infine salvando il file e riavviando il computer, vedrete il frutto delle vostre fatiche con una schermata pulita e molto più  apprezzabile che includerà soltanto:

-Ubuntu

-(vostro sistema secondario)

Empathy – Messaggistica universale per Ubuntu

Empaty - Reyboz Blog

Ogni giorno messaggiamo con servizi ingombranti, come ad esempio la chat di Facebook, che per essere utilizzata si deve tenere aperto il browser anche se si desidera solo e soltanto la chat…oppure MSN che si appesantisce ammorbandoci di pubblicità e funzioni mai prese in considerazione.
Per fortuna in Ubuntu qualcuno ha ben pensato di crearne una veloce che riesce a gestire in una piccola finestrella ogni tipo di client messaggistico, il suo nome è  Empathy, ma non richiede presentazioni in quanto spesso, è preinstallata.

Con essa si potranno importare (anche contemporaneamente) tutti questi servizi:

  • AIM
  • Chat Facebook
  • Google Talk
  • Chat IRC
  • MSN
  • Chat MySpace
  • Chat Yahoo!
  • Jabber

E ancora altre!

Perchè non provarlo dunque?
Troveremo Empathy cliccando sul nostro nome utente di Ubuntu (in alto a destra del nostro schermo) e selezionando Account Messaggistica nel menù a tendina.

Impostare le chat

Settaggio di una chat con Empathy - Reyboz Blog

Per impostare una chat (di quella di Facebook ne parliamo nel paragrafo dopo) basta:

  • Aprire Empathy dal nome utente di Ubuntu → Account messaggistica
  • Cliccare Aggiungi
  • Scegliere un protocollo (MSN ad esempio)
  • Inserire i dati (nome e password)
  • Applicare la scelta

In seguito nella stessa finestra cliccheremo sulla chat appena impostata nel menù a sinistra e nel blocco che comparirà a destra spunteremo la casella Abilita.
In questo modo appena riceveremo un messaggio da un amico, si presenterà alla nostra attenzione una finestra a suo nome con solo e soltanto la chat a lui dedicata.

Impostare la chat di Facebook

Settaggio chat di Facebook su Empathy - Reyboz Blog

Per abilitare la chat di Facebook è leggermente più complicato ma si risolve in meno di qualche minuto.

  • Apriamo Empathy dal nome utente di Ubuntu → Account messaggistica
  • Clicchiamo sul bottone Aggiungi
  • Scegliamo il protocollo Facebook
  • Clicchiamo sul link di Empathy nominato come Questa pagina

Si aprirà il browser con la schermata di Facebook richiedente il nome utente personale sostitutivo all’ID identificativo numerico, sceglietelo e salvatelo. A questo punto

  • Copiamo il nostro nome utente di Facebook appena scelto
  • Incolliamolo come nome utente anche su Empathy
  • Inseriamo la nostra password di Facebook su Empathy
  • Applichiamo le modifiche

Avremo così impostato la nostra chat di Facebook, successivamente occorrerà spuntare il blocco Abilità nella stessa identica finestra, et voilà, appena riceveremo un messaggio da un amico si aprirà una finestrella a suo nome in cui potremo messaggiare senza nient’altro di superfluo.

Piccola pignoleria

Icona del pannello di Ubuntu - Reyboz Blog

Per avere a disposizione la lista dei contatti on-line occorre aver attivato un indicatore di Evolution nel pannello del nostro Ubuntu. Se non lo abbiamo già fatto inseriamolo adesso:

  • Clic sul pannello superiore di Ubuntu → Aggiungi al pannello
  • Cerchiamo l’Indicatore e aggiungiamolo

A questo punto avremo un’icona a forma di e-mail sulla quale, cliccandoci sopra e scegliendo la voce Chat, avremo a disposizione anche l’intera lista contatti.


Motore di ricerca Reyboz Search

Il 3 ottobre 2010 era arrivato online il “motore di ricerca” Reyboz search. Era una inutile fottuta pagina con una fottuta <form> che rimandava a Google. Su sfondo nero.

Questo non è un motore di ricerca, questa è una stronzata.

Questo articolo rimarrà qui per ricordarmi di quanto fossi deficiente.

Google a risparmio energetico? – Blackr? Yeeeah!(?)

Blackr è stato “Google in abito scuro” (ora è uno squallido blog pubblicitario).

Blackr - Google in abito nero - Reyboz Blog
http://blackr.it

Secondo l’autore di Blackr, avere una versione di Google completamente nera aiuterebbe a far risparmiare energia e a salvare il pianeta.

I conti secondo l’autore

  • Google conta circa: 200 milioni di ricerche al giorno
  • L’utilizzo medio di Google è di: 10 secondi al giorno/persona

Quindi in totale su Google si trascorrerebbero in media 550 mila ore al giorno.

Ma continua:

  • Se un monitor sulla pagina bianca di Google utilizza circa: 74 Watt
  • Mentre Blackr ne fa consumare circa: 56 Watt

Il risparmio mondiale annuale sarebbe mediamente di: 3000 Megawatt/ora all’anno.

L’autore continua dicendo che una centrale nucleare produce in media 1600 Megawatt… e che utilizza circa 30 tonnellate di uranio, «ditemi voi perchè non provare».

Bisogna subito passare a Blackr perchè altrimenti siamo spacciati usando Google perchè il bianco consuma e il nero no mentre il nero non consuma e il bianco sì insomma no uranio no centrali nucleari!1!1!1!

L’autore di Blackr afferma che usare Blackr potrebbe salvare i nostri figli, i nostri nipoti, i gatti dei nostri nipoti, …, però bisognerebbe anche considerare che la persona che ha tirato su questo sito guadagna vagonate di soldi in pubblicità tramite un servizio offerto da Google chiamato Google CSE, che permette appunto di offrire una pagina di risultati di Google personalizzata (qui, in “nero”). Insomma, più gente usa questo servizio più gente clicca sui risultati in evidenza da Google Adword → più gente clicca sui risultati di Google Adword e più Blackr guadagna vagonate di soldi.

Inoltre usando Blackr si sta regalando a Blackr qualsiasi propria parola digitata. OK, mediamente a nessuno interessa la propria privacy, ma se foste voi i proprietari di Blackr, immaginate di poter sapere cosa ha cercato chi.

Piccola parentesi: già Google ha questo problema:

È lo stesso problema che ha anche Google
It’s the same problem Google has

Ammetto di aver usato Blackr per un bel periodo, ma in ogni caso ho sempre avuto il componente aggiuntivo Self-destructing cookies e Adblock Edge abilitati sul mio bel Mozilla Firefox, per ogni sito esistente.

Insomma, può davvero Blackr salvarci? Io credo neanche minimamente. Tutti piuttosto dovrebbero sapere che i drammi ecologici stanno alla fonte. Insomma a parer mio si è riusciti a fare vagonate di soldi nel nome dell’ambiente, strumentalizzando gli ambientalisti.

Una stretta di mano virtuale ad un grande business-man: l’autore di Blackr. Riuscendo a far vagonate di soldi facendo informaticamente nulla e ecologicamente quasi niente. (Ricorderei che diversi “giornalisti” hanno sponsorizzato “a gratis” Blackr nei più disparati servizi televisivi sulla tecnologia, Rai e Mediaset).

Geniale.

(Immagine ovviamente presa da xkcd, sotto licenza CC-By-Nc.)