Archivi tag: Mac

Minecraft

Minecraft è un gioco di costruzione assai geniale. E’ uno dei tanti remake di giochi sandbox apparsi negli ultimi anni e che sta facendo la fortuna degli sviluppatori, dei ragazzi indipendenti che vendendo il gioco in beta hanno gia fatto una fortuna..

http://www.minecraft.net

Il gioco tuttora in beta, consiste nell’esplorare un mondo dinamico , generato tramite perlin noise, e gestito tramite un complesso sistema di cubi (tramite un motore basato sui voxel) . Tutto e’ un cubo su minecraft, ed e’ possibile creare dei piccoli server per giocare in multiplayer. Ci sono tantissimi mod per ampliare le possibilità. texture packs, e ci si diverte un casino se si ha un minimo di creatività.

Cosi mi sono cimentato per gioco nella creazione di un piccolo mondo per farci giocare mio figlio, sai.. la classica frase “tutto questo un giorno sarà tuo”.. beh io posso lasciare solo cose virtuali, perche di concreto ho poco o nulla 🙂

A questo indirizzo c’e’ un piccolo video creato agli inizi della nostra avventura con Valerio e Lorenzo :

http://www.facebook.com/video/video.php?v=1715168049391

 

Ora il gioco sta per passare alla versione 1.8 con tante aggiunte e sicuramente un mondo di divertimento.

Il grosso del divertimento nel gioco, sta nella costruzione di rifugi per passare la notte, perche durante la notte terribili creature (anche loro cubettose) escono allo scoperto per uccidere gli abitanti del mondo, e poi dissolversi al mattino..

Cosi nel prossimo articolo vi mostrerò parte del mondo creato per valerio.. con torri di guardia, un castello, un villaggio di pescatori.. etc etc.

 

Configurare Symphonic Choirs & Wordbuilder in Logic Studio

Dopo essere letteralmente impazzito nel tentativo di farlo funzionare, aver cercato in lungo e largo, sono finalmente arrivato ad un metodo funzionante.

Se avete Symphonic Choirs della EastWest, e volete farlo funzionare con il WordBuilder (il tool per la creazione di parole per i cori), e logic studio 9, ecco dei semplici passi da seguire.

Innanzitutto eseguite l’installazione di tutta la suite (circa 40 giga di roba).

Poi dovrete procurarvi un nuovo player per i multi files di Symphonic Choirs perche il plugin nativo è troppo vecchio e non viene visto da Logic Studio. Io ho preso Native Instruments Kontakt Player 4.0 che e’ piu che sufficiente.

Fate partire WorldBuilder e selezionate questi settings:

Poi selezioniamo una frase di test da quelle disponibili in latino

 

Ora che abbiamo preparato Wordbuilder passiamo a Logic Studio .

Facciamolo partire con un nuovo progetto, e prepariamo due tracce:

La prima traccia è una traccia External Midi che faremo puntare alla porta di WorldBuilder1

La seconda traccia invece è un Software Instrument . Andiamo Sulla sezione di I/O della traccia e carichiamo il plugin player Kontakt 4.0

Si aprirà il plugin.

Nella sezione di configurazione , andiamo ad impostre il path dei multi (i pacchetti di suoni) di Symphonic Choirs:

A questo punto carichiamo le voci di Symphonic Choirs.

I multi da caricare sono quelli che hanno nel nome le lettere WB (wordbuilder).

Selezioniamole dai Basses cosi come abbiamo scelto sul wordbuilder:

Ora dobbiamo configurare le rotte midi su Logic Studio, per far questo apriamo la finestra dell’environment (command 8)

Dalla vista Mixer, copiamo la traccia con il software instrument dei cori

poi dal menu in alto cambialo visualizzazione e andiamo a click & ports.

qui incolliamo il canale del software instrument

Poi selezioniamo il canale del wordbuilder1 e lo colleghiamo al canale appena incollato e cancelliamo il link sul “Sum”

Prendiamo invece la CapsLock Keyboard  e lo colleghiamo con la tastiera midi nell’interfaccia, e selezioniamo poi tutti i tasti della tastiera in modo da registrare tutti gli eventi midi associati .

Fatto questo il plugin è configurato. Torniamo alla nostra finestra di Arrange e selezionando la prima traccia e premendo il tasto capslock siamo in grado di far apparire la tastiera midi e suonare qualcosa che riproduca le frasi impostate sul wordbuilder.

Mettendo questa frase sul wordbuilder

mo r!E t!O rE t!e Sa lO t!ant!

(il votox di Morituri te Salutant)

ecco cosa esce fuori:

MORITURI

 

NSXmlParser il default XmlParser di iOS

Per chi lavora da molto con la programmazione, sia Java che .Net, avere a disposizione un Dom per la lettura dei files xml tramite un documento a grafo e magari espressioni xpath, è oramai legge.

Eppure per lavorare su IPhone tramite iOS e in generale su Mac OSX, di default troviamo solo ed esclusivamente un SaxParser, l’NSXmlParser..

Superato l’impatto delle Sax (da sempre ostiche ma sicuramente molto performanti), facciamo un velocissimo esempio di come usarle in una nostra classe, per leggere velocemente dei dati da un file xml.

Innanzitutto aggiungiamo l’interfaccia  NSXMLParserDelegate alla classe che riceverà gli eventi Sax, perche le Sax lavorano completamente ad eventi. Quando verrà lanciato il parser, scatteranno eventi ogni volta che si verificherà una condizione (aperto nodo, presenza testo, chiuso nodo, etc etc etc )

1
@interface MiaClasse : NSObject <NSXMLParserDelegate>

 

in questa classe (che può essere una qualsiasi classe del nostro progetto, dichiariamo l’xml parser nell’header , l’elemento che conterrà l’array di dati che andiamo ad estrarre, i puntatori per i singoli valori (on the fly come variabili secche, ma in genere meglio definire un oggetto Item che esponga tutti gli attributi), il puntatore all’elemento xml corrente che il parser sta analizzando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@interface MiaClasse : NSObject <NSXMLParserDelegate>

//parser

NSXMLParser *xmlParser;

//array che conterrà i dati

NSMutableArray *elencoItems;

//variabile temporanea per ogni elemento

NSMutableDictionary *item;// nome del nodo corrente che il sax parser sta analizzando

NSString *currentElement;

//elementi che leggeremo e poi memorizzeremo

NSMutableString *nome, *cognome, *indirizzo;

ora che abbiamo definito l’header, passiamo all’implementazione.

Inizializziamo il parser e l’array di dati nel metodo in cui lo andiamo ad usare, nel costruttore o dove vogliamo.

In questo caso andiamo a leggere il file xml da risorsa locale, ma possiamo accedere tranquillamente ad un file remoto .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)applicationDidFinishLaunching:(UIApplication *)application {

elencoItems= [[NSMutableArray alloc] init];

xmlParser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.xml"]  ]];

//definiamo il delegato che riceverà gli eventi (in questo caso la classe stessa

[xmlParser setDelegate:self];

//saltiamo i problemi di namespace

[xmlParser setShouldProcessNamespaces:NO];

[xmlParser setShouldReportNamespacePrefixes:NO];

[xmlParser setShouldResolveExternalEntities:NO];

// avviamo il parsing XML

[xmlParser parse];

}

 

ora definiamo i metodi essenziali per soddisfare l’interfaccia NSXMLParserDelegate:

didStartElement , che viene eseguito ad ogni inizio di elemento xml trovato

didEndElement, che viene eseguito quando viene analizzata la chiusura di un tag xml

foundCharacters, che viene eseguito quando si analizza il contenuto di tipo “text” di un elemento

parserDidEndDocument, che scatta quando si raggiunge la fine del documento xml.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{

currentElement = [elementName copy];

//qui mettiamo tutte le regole di match del nostro xml, ad esempio cosa fare quando

// si incontra un nodo denominato "persona"

if ([elementName isEqualToString:@"persona"]) {

// inizializza tutti gli elementi che conterranno i dati. memorizzeremo ogni item come tabella per praticità

item = [[NSMutableDictionary alloc] init];

nome = [[NSMutableString alloc] init];

cognome = [[NSMutableString alloc] init];

indirizzo = [[NSMutableString alloc] init];

}

}

 

Nel metodo didEndElement andremo fisicamente a prendere i dati letti e a memorizzarli in una struttura (il nostro array)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{

if ([elementName isEqualToString:@"persona"]) {

[item setObject:nome forKey:@"nome"];

[item setObject:cognome forKey:@"cognome"];

[item setObject:indirizzo forKey:@"indirizzo"];

[elencoItems addObject:[item copy]];

}

}

 

Ed ora il metodo che fisicamente legge i dati dai nodi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

if ([currentElement isEqualToString:@"nome"]){

[nome appendString:string];

} else if ([currentElement isEqualToString:@"cognome"]) {

[cognome appendString:string];

} else if ([currentElement isEqualToString:@"indirizzo"]) {

[indirizzo appendString:string];

} }

 

Infine se a termine del traversing del grafo xml dobbiamo effettuare delle operazioni, come prendere il risultato e passarlo ad altri oggetti, utilizziamo il parserDidEndDocument:

1
2
3
4
5
6
7
- (void)parserDidEndDocument:(NSXMLParser *)parser {

[mioOggetti setData:elencoItems];

[elencoItems release];

}

In linea di massima e’ molto semplice utilizzare XmlParser.

Come tutti i framework e metodologie su iOS si fa un grande uso dei delegati.

Spero di esservi stato di aiuto.